(function(S, N) {
	"object" === typeof module && module.exports ? module.exports = S.document ? N(S) : N : S.Highcharts = N(S)
})("undefined" !== typeof window ? window : this, function(S) {
	var N = function() {
			var a = "undefined" === typeof S ? window : S,
				D = a.document,
				B = a.navigator && a.navigator.userAgent || "",
				G = D && D.createElementNS && !! D.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGRect,
				p = /(edge|msie|trident)/i.test(B) && !a.opera,
				g = /Firefox/.test(B),
				l = g && 4 > parseInt(B.split("Firefox/")[1], 10);
			return a.Highcharts ? a.Highcharts.error(16, !0) : {
				product: "Highcharts",
				version: "6.0.3",
				deg2rad: 2 * Math.PI / 360,
				doc: D,
				hasBidiBug: l,
				hasTouch: D && void 0 !== D.documentElement.ontouchstart,
				isMS: p,
				isWebKit: /AppleWebKit/.test(B),
				isFirefox: g,
				isTouchDevice: /(Mobile|Android|Windows Phone)/.test(B),
				SVG_NS: "http://www.w3.org/2000/svg",
				chartCount: 0,
				seriesTypes: {},
				symbolSizes: {},
				svg: G,
				win: a,
				marginNames: ["plotTop", "marginRight", "marginBottom", "plotLeft"],
				noop: function() {},
				charts: []
			}
		}();
	(function(a) {
		a.timers = [];
		var D = a.charts,
			B = a.doc,
			G = a.win;
		a.error = function(p, g) {
			p = a.isNumber(p) ? "Highcharts error #" + p + ": www.highcharts.com/errors/" + p : p;
			if (g) throw Error(p);
			G.console && console.log(p)
		};
		a.Fx = function(a, g, l) {
			this.options = g;
			this.elem = a;
			this.prop = l
		};
		a.Fx.prototype = {
			dSetter: function() {
				var a = this.paths[0],
					g = this.paths[1],
					l = [],
					r = this.now,
					n = a.length,
					w;
				if (1 === r) l = this.toD;
				else if (n === g.length && 1 > r) for (; n--;) w = parseFloat(a[n]), l[n] = isNaN(w) ? g[n] : r * parseFloat(g[n] - w) + w;
				else l = g;
				this.elem.attr("d", l, null, !0)
			},
			update: function() {
				var a = this.elem,
					g = this.prop,
					l = this.now,
					r = this.options.step;
				if (this[g + "Setter"]) this[g + "Setter"]();
				else a.attr ? a.element && a.attr(g, l, null, !0) : a.style[g] = l + this.unit;
				r && r.call(a, l, this)
			},
			run: function(p, g, l) {
				var r = this,
					n = r.options,
					w = function(a) {
						return w.stopped ? !1 : r.step(a)
					},
					v = G.requestAnimationFrame ||
				function(a) {
					setTimeout(a, 13)
				}, e = function() {
					a.timers = a.grep(a.timers, function(a) {
						return a()
					});
					a.timers.length && v(e)
				};
				p === g ? (delete n.curAnim[this.prop], n.complete && 0 === a.keys(n.curAnim).length && n.complete()) : (this.startTime = +new Date, this.start = p, this.end = g, this.unit = l, this.now = this.start, this.pos = 0, w.elem = this.elem, w.prop = this.prop, w() && 1 === a.timers.push(w) && v(e))
			},
			step: function(p) {
				var g = +new Date,
					l, r = this.options,
					n = this.elem,
					w = r.complete,
					v = r.duration,
					e = r.curAnim;
				n.attr && !n.element ? p = !1 : p || g >= v + this.startTime ? (this.now = this.end, this.pos = 1, this.update(), l = e[this.prop] = !0, a.objectEach(e, function(a) {
					!0 !== a && (l = !1)
				}), l && w && w.call(n), p = !1) : (this.pos = r.easing((g - this.startTime) / v), this.now = this.start + (this.end - this.start) * this.pos, this.update(), p = !0);
				return p
			},
			initPath: function(p, g, l) {
				function r(a) {
					var b, f;
					for (d = a.length; d--;) b = "M" === a[d] || "L" === a[d], f = /[a-zA-Z]/.test(a[d + 3]), b && f && a.splice(d + 1, 0, a[d + 1], a[d + 2], a[d + 1], a[d + 2])
				}
				function n(a, b) {
					for (; a.length < f;) {
						a[0] = b[f - a.length];
						var e = a.slice(0, c);
						[].splice.apply(a, [0, 0].concat(e));
						y && (e = a.slice(a.length - c), [].splice.apply(a, [a.length, 0].concat(e)), d--)
					}
					a[0] = "M"
				}
				function w(a, d) {
					for (var e = (f - a.length) / c; 0 < e && e--;) b = a.slice().splice(a.length / H - c, c * H), b[0] = d[f - c - e * c], m && (b[c - 6] = b[c - 2], b[c - 5] = b[c - 1]), [].splice.apply(a, [a.length / H, 0].concat(b)), y && e--
				}
				g = g || "";
				var v, e = p.startX,
					h = p.endX,
					m = -1 < g.indexOf("C"),
					c = m ? 7 : 3,
					f, b, d;
				g = g.split(" ");
				l = l.slice();
				var y = p.isArea,
					H = y ? 2 : 1,
					J;
				m && (r(g), r(l));
				if (e && h) {
					for (d = 0; d < e.length; d++) if (e[d] === h[0]) {
						v = d;
						break
					} else if (e[0] === h[h.length - e.length + d]) {
						v = d;
						J = !0;
						break
					}
					void 0 === v && (g = [])
				}
				g.length && a.isNumber(v) && (f = l.length + v * H * c, J ? (n(g, l), w(l, g)) : (n(l, g), w(g, l)));
				return [g, l]
			}
		};
		a.Fx.prototype.fillSetter = a.Fx.prototype.strokeSetter = function() {
			this.elem.attr(this.prop, a.color(this.start).tweenTo(a.color(this.end), this.pos), null, !0)
		};
		a.extend = function(a, g) {
			var l;
			a || (a = {});
			for (l in g) a[l] = g[l];
			return a
		};
		a.merge = function() {
			var p, g = arguments,
				l, r = {},
				n = function(l, v) {
					"object" !== typeof l && (l = {});
					a.objectEach(v, function(e, h) {
						!a.isObject(e, !0) || a.isClass(e) || a.isDOMElement(e) ? l[h] = v[h] : l[h] = n(l[h] || {}, e)
					});
					return l
				};
			!0 === g[0] && (r = g[1], g = Array.prototype.slice.call(g, 2));
			l = g.length;
			for (p = 0; p < l; p++) r = n(r, g[p]);
			return r
		};
		a.pInt = function(a, g) {
			return parseInt(a, g || 10)
		};
		a.isString = function(a) {
			return "string" === typeof a
		};
		a.isArray = function(a) {
			a = Object.prototype.toString.call(a);
			return "[object Array]" === a || "[object Array Iterator]" === a
		};
		a.isObject = function(p, g) {
			return !!p && "object" === typeof p && (!g || !a.isArray(p))
		};
		a.isDOMElement = function(p) {
			return a.isObject(p) && "number" === typeof p.nodeType
		};
		a.isClass = function(p) {
			var g = p && p.constructor;
			return !(!a.isObject(p, !0) || a.isDOMElement(p) || !g || !g.name || "Object" === g.name)
		};
		a.isNumber = function(a) {
			return "number" === typeof a && !isNaN(a)
		};
		a.erase = function(a, g) {
			for (var l = a.length; l--;) if (a[l] === g) {
				a.splice(l, 1);
				break
			}
		};
		a.defined = function(a) {
			return void 0 !== a && null !== a
		};
		a.attr = function(p, g, l) {
			var r;
			a.isString(g) ? a.defined(l) ? p.setAttribute(g, l) : p && p.getAttribute && (r = p.getAttribute(g)) : a.defined(g) && a.isObject(g) && a.objectEach(g, function(a, l) {
				p.setAttribute(l, a)
			});
			return r
		};
		a.splat = function(p) {
			return a.isArray(p) ? p : [p]
		};
		a.syncTimeout = function(a, g, l) {
			if (g) return setTimeout(a, g, l);
			a.call(0, l)
		};
		a.pick = function() {
			var a = arguments,
				g, l, r = a.length;
			for (g = 0; g < r; g++) if (l = a[g], void 0 !== l && null !== l) return l
		};
		a.css = function(p, g) {
			a.isMS && !a.svg && g && void 0 !== g.opacity && (g.filter = "alpha(opacity\x3d" + 100 * g.opacity + ")");
			a.extend(p.style, g)
		};
		a.createElement = function(p, g, l, r, n) {
			p = B.createElement(p);
			var w = a.css;
			g && a.extend(p, g);
			n && w(p, {
				padding: 0,
				border: "none",
				margin: 0
			});
			l && w(p, l);
			r && r.appendChild(p);
			return p
		};
		a.extendClass = function(p, g) {
			var l = function() {};
			l.prototype = new p;
			a.extend(l.prototype, g);
			return l
		};
		a.pad = function(a, g, l) {
			return Array((g || 2) + 1 - String(a).length).join(l || 0) + a
		};
		a.relativeLength = function(a, g, l) {
			return /%$/.test(a) ? g * parseFloat(a) / 100 + (l || 0) : parseFloat(a)
		};
		a.wrap = function(a, g, l) {
			var r = a[g];
			a[g] = function() {
				var a = Array.prototype.slice.call(arguments),
					g = arguments,
					v = this;
				v.proceed = function() {
					r.apply(v, arguments.length ? arguments : g)
				};
				a.unshift(r);
				a = l.apply(this, a);
				v.proceed = null;
				return a
			}
		};
		a.getTZOffset = function(p) {
			var g = a.Date;
			return 6E4 * (g.hcGetTimezoneOffset && g.hcGetTimezoneOffset(p) || g.hcTimezoneOffset || 0)
		};
		a.dateFormat = function(p, g, l) {
			if (!a.defined(g) || isNaN(g)) return a.defaultOptions.lang.invalidDate || "";
			p = a.pick(p, "%Y-%m-%d %H:%M:%S");
			var r = a.Date,
				n = new r(g - a.getTZOffset(g)),
				w = n[r.hcGetHours](),
				v = n[r.hcGetDay](),
				e = n[r.hcGetDate](),
				h = n[r.hcGetMonth](),
				m = n[r.hcGetFullYear](),
				c = a.defaultOptions.lang,
				f = c.weekdays,
				b = c.shortWeekdays,
				d = a.pad,
				r = a.extend({
					a: b ? b[v] : f[v].substr(0, 3),
					A: f[v],
					d: d(e),
					e: d(e, 2, " "),
					w: v,
					b: c.shortMonths[h],
					B: c.months[h],
					m: d(h + 1),
					y: m.toString().substr(2, 2),
					Y: m,
					H: d(w),
					k: w,
					I: d(w % 12 || 12),
					l: w % 12 || 12,
					M: d(n[r.hcGetMinutes]()),
					p: 12 > w ? "AM" : "PM",
					P: 12 > w ? "am" : "pm",
					S: d(n.getSeconds()),
					L: d(Math.round(g % 1E3), 3)
				}, a.dateFormats);
			a.objectEach(r, function(a, b) {
				for (; - 1 !== p.indexOf("%" + b);) p = p.replace("%" + b, "function" === typeof a ? a(g) : a)
			});
			return l ? p.substr(0, 1).toUpperCase() + p.substr(1) : p
		};
		a.formatSingle = function(p, g) {
			var l = /\.([0-9])/,
				r = a.defaultOptions.lang;
			/f$/.test(p) ? (l = (l = p.match(l)) ? l[1] : -1, null !== g && (g = a.numberFormat(g, l, r.decimalPoint, -1 < p.indexOf(",") ? r.thousandsSep : ""))) : g = a.dateFormat(p, g);
			return g
		};
		a.format = function(p, g) {
			for (var l = "{", r = !1, n, w, v, e, h = [], m; p;) {
				l = p.indexOf(l);
				if (-1 === l) break;
				n = p.slice(0, l);
				if (r) {
					n = n.split(":");
					w = n.shift().split(".");
					e = w.length;
					m = g;
					for (v = 0; v < e; v++) m && (m = m[w[v]]);
					n.length && (m = a.formatSingle(n.join(":"), m));
					h.push(m)
				} else h.push(n);
				p = p.slice(l + 1);
				l = (r = !r) ? "}" : "{"
			}
			h.push(p);
			return h.join("")
		};
		a.getMagnitude = function(a) {
			return Math.pow(10, Math.floor(Math.log(a) / Math.LN10))
		};
		a.normalizeTickInterval = function(p, g, l, r, n) {
			var w, v = p;
			l = a.pick(l, 1);
			w = p / l;
			g || (g = n ? [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] : [1, 2, 2.5, 5, 10], !1 === r && (1 === l ? g = a.grep(g, function(a) {
				return 0 === a % 1
			}) : .1 >= l && (g = [1 / l])));
			for (r = 0; r < g.length && !(v = g[r], n && v * l >= p || !n && w <= (g[r] + (g[r + 1] || g[r])) / 2); r++);
			return v = a.correctFloat(v * l, -Math.round(Math.log(.001) / Math.LN10))
		};
		a.stableSort = function(a, g) {
			var l = a.length,
				r, n;
			for (n = 0; n < l; n++) a[n].safeI = n;
			a.sort(function(a, n) {
				r = g(a, n);
				return 0 === r ? a.safeI - n.safeI : r
			});
			for (n = 0; n < l; n++) delete a[n].safeI
		};
		a.arrayMin = function(a) {
			for (var g = a.length, l = a[0]; g--;) a[g] < l && (l = a[g]);
			return l
		};
		a.arrayMax = function(a) {
			for (var g = a.length, l = a[0]; g--;) a[g] > l && (l = a[g]);
			return l
		};
		a.destroyObjectProperties = function(p, g) {
			a.objectEach(p, function(a, r) {
				a && a !== g && a.destroy && a.destroy();
				delete p[r]
			})
		};
		a.discardElement = function(p) {
			var g = a.garbageBin;
			g || (g = a.createElement("div"));
			p && g.appendChild(p);
			g.innerHTML = ""
		};
		a.correctFloat = function(a, g) {
			return parseFloat(a.toPrecision(g || 14))
		};
		a.setAnimation = function(p, g) {
			g.renderer.globalAnimation = a.pick(p, g.options.chart.animation, !0)
		};
		a.animObject = function(p) {
			return a.isObject(p) ? a.merge(p) : {
				duration: p ? 500 : 0
			}
		};
		a.timeUnits = {
			millisecond: 1,
			second: 1E3,
			minute: 6E4,
			hour: 36E5,
			day: 864E5,
			week: 6048E5,
			month: 24192E5,
			year: 314496E5
		};
		a.numberFormat = function(p, g, l, r) {
			p = +p || 0;
			g = +g;
			var n = a.defaultOptions.lang,
				w = (p.toString().split(".")[1] || "").split("e")[0].length,
				v, e, h = p.toString().split("e"); - 1 === g ? g = Math.min(w, 20) : a.isNumber(g) || (g = 2);
			e = (Math.abs(h[1] ? h[0] : p) + Math.pow(10, -Math.max(g, w) - 1)).toFixed(g);
			w = String(a.pInt(e));
			v = 3 < w.length ? w.length % 3 : 0;
			l = a.pick(l, n.decimalPoint);
			r = a.pick(r, n.thousandsSep);
			p = (0 > p ? "-" : "") + (v ? w.substr(0, v) + r : "");
			p += w.substr(v).replace(/(\d{3})(?=\d)/g, "$1" + r);
			g && (p += l + e.slice(-g));
			h[1] && (p += "e" + h[1]);
			return p
		};
		Math.easeInOutSine = function(a) {
			return -.5 * (Math.cos(Math.PI * a) - 1)
		};
		a.getStyle = function(p, g, l) {
			if ("width" === g) return Math.min(p.offsetWidth, p.scrollWidth) - a.getStyle(p, "padding-left") - a.getStyle(p, "padding-right");
			if ("height" === g) return Math.min(p.offsetHeight, p.scrollHeight) - a.getStyle(p, "padding-top") - a.getStyle(p, "padding-bottom");
			G.getComputedStyle || a.error(27, !0);
			if (p = G.getComputedStyle(p, void 0)) p = p.getPropertyValue(g), a.pick(l, "opacity" !== g) && (p = a.pInt(p));
			return p
		};
		a.inArray = function(p, g) {
			return (a.indexOfPolyfill || Array.prototype.indexOf).call(g, p)
		};
		a.grep = function(p, g) {
			return (a.filterPolyfill || Array.prototype.filter).call(p, g)
		};
		a.find = Array.prototype.find ?
		function(a, g) {
			return a.find(g)
		} : function(a, g) {
			var l, r = a.length;
			for (l = 0; l < r; l++) if (g(a[l], l)) return a[l]
		};
		a.map = function(a, g) {
			for (var l = [], r = 0, n = a.length; r < n; r++) l[r] = g.call(a[r], a[r], r, a);
			return l
		};
		a.keys = function(p) {
			return (a.keysPolyfill || Object.keys).call(void 0, p)
		};
		a.reduce = function(p, g, l) {
			return (a.reducePolyfill || Array.prototype.reduce).call(p, g, l)
		};
		a.offset = function(a) {
			var g = B.documentElement;
			a = a.parentElement ? a.getBoundingClientRect() : {
				top: 0,
				left: 0
			};
			return {
				top: a.top + (G.pageYOffset || g.scrollTop) - (g.clientTop || 0),
				left: a.left + (G.pageXOffset || g.scrollLeft) - (g.clientLeft || 0)
			}
		};
		a.stop = function(p, g) {
			for (var l = a.timers.length; l--;) a.timers[l].elem !== p || g && g !== a.timers[l].prop || (a.timers[l].stopped = !0)
		};
		a.each = function(p, g, l) {
			return (a.forEachPolyfill || Array.prototype.forEach).call(p, g, l)
		};
		a.objectEach = function(a, g, l) {
			for (var r in a) a.hasOwnProperty(r) && g.call(l, a[r], r, a)
		};
		a.addEvent = function(p, g, l) {
			var r, n, w = p.addEventListener || a.addEventListenerPolyfill;
			p.hcEvents && !p.hasOwnProperty("hcEvents") && (n = {}, a.objectEach(p.hcEvents, function(a, e) {
				n[e] = a.slice(0)
			}), p.hcEvents = n);
			r = p.hcEvents = p.hcEvents || {};
			w && w.call(p, g, l, !1);
			r[g] || (r[g] = []);
			r[g].push(l);
			return function() {
				a.removeEvent(p, g, l)
			}
		};
		a.removeEvent = function(p, g, l) {
			function r(e, m) {
				var c = p.removeEventListener || a.removeEventListenerPolyfill;
				c && c.call(p, e, m, !1)
			}
			function n() {
				var e, m;
				p.nodeName && (g ? (e = {}, e[g] = !0) : e = v, a.objectEach(e, function(a, f) {
					if (v[f]) for (m = v[f].length; m--;) r(f, v[f][m])
				}))
			}
			var w, v = p.hcEvents,
				e;
			v && (g ? (w = v[g] || [], l ? (e = a.inArray(l, w), -1 < e && (w.splice(e, 1), v[g] = w), r(g, l)) : (n(), v[g] = [])) : (n(), p.hcEvents = {}))
		};
		a.fireEvent = function(p, g, l, r) {
			var n;
			n = p.hcEvents;
			var w, v;
			l = l || {};
			if (B.createEvent && (p.dispatchEvent || p.fireEvent)) n = B.createEvent("Events"), n.initEvent(g, !0, !0), a.extend(n, l), p.dispatchEvent ? p.dispatchEvent(n) : p.fireEvent(g, n);
			else if (n) for (n = n[g] || [], w = n.length, l.target || a.extend(l, {
				preventDefault: function() {
					l.defaultPrevented = !0
				},
				target: p,
				type: g
			}), g = 0; g < w; g++)(v = n[g]) && !1 === v.call(p, l) && l.preventDefault();
			r && !l.defaultPrevented && r(l)
		};
		a.animate = function(p, g, l) {
			var r, n = "",
				w, v, e;
			a.isObject(l) || (e = arguments, l = {
				duration: e[2],
				easing: e[3],
				complete: e[4]
			});
			a.isNumber(l.duration) || (l.duration = 400);
			l.easing = "function" === typeof l.easing ? l.easing : Math[l.easing] || Math.easeInOutSine;
			l.curAnim = a.merge(g);
			a.objectEach(g, function(e, m) {
				a.stop(p, m);
				v = new a.Fx(p, l, m);
				w = null;
				"d" === m ? (v.paths = v.initPath(p, p.d, g.d), v.toD = g.d, r = 0, w = 1) : p.attr ? r = p.attr(m) : (r = parseFloat(a.getStyle(p, m)) || 0, "opacity" !== m && (n = "px"));
				w || (w = e);
				w && w.match && w.match("px") && (w = w.replace(/px/g, ""));
				v.run(r, w, n)
			})
		};
		a.seriesType = function(p, g, l, r, n) {
			var w = a.getOptions(),
				v = a.seriesTypes;
			w.plotOptions[p] = a.merge(w.plotOptions[g], l);
			v[p] = a.extendClass(v[g] ||
			function() {}, r);
			v[p].prototype.type = p;
			n && (v[p].prototype.pointClass = a.extendClass(a.Point, n));
			return v[p]
		};
		a.uniqueKey = function() {
			var a = Math.random().toString(36).substring(2, 9),
				g = 0;
			return function() {
				return "highcharts-" + a + "-" + g++
			}
		}();
		G.jQuery && (G.jQuery.fn.highcharts = function() {
			var p = [].slice.call(arguments);
			if (this[0]) return p[0] ? (new(a[a.isString(p[0]) ? p.shift() : "Chart"])(this[0], p[0], p[1]), this) : D[a.attr(this[0], "data-highcharts-chart")]
		})
	})(N);
	(function(a) {
		var D = a.each,
			B = a.isNumber,
			G = a.map,
			p = a.merge,
			g = a.pInt;
		a.Color = function(l) {
			if (!(this instanceof a.Color)) return new a.Color(l);
			this.init(l)
		};
		a.Color.prototype = {
			parsers: [{
				regex: /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,
				parse: function(a) {
					return [g(a[1]), g(a[2]), g(a[3]), parseFloat(a[4], 10)]
				}
			}, {
				regex: /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,
				parse: function(a) {
					return [g(a[1]), g(a[2]), g(a[3]), 1]
				}
			}],
			names: {
				none: "rgba(255,255,255,0)",
				white: "#ffffff",
				black: "#000000"
			},
			init: function(l) {
				var g, n, w, v;
				if ((this.input = l = this.names[l && l.toLowerCase ? l.toLowerCase() : ""] || l) && l.stops) this.stops = G(l.stops, function(e) {
					return new a.Color(e[1])
				});
				else if (l && l.charAt && "#" === l.charAt() && (g = l.length, l = parseInt(l.substr(1), 16), 7 === g ? n = [(l & 16711680) >> 16, (l & 65280) >> 8, l & 255, 1] : 4 === g && (n = [(l & 3840) >> 4 | (l & 3840) >> 8, (l & 240) >> 4 | l & 240, (l & 15) << 4 | l & 15, 1])), !n) for (w = this.parsers.length; w-- && !n;) v = this.parsers[w], (g = v.regex.exec(l)) && (n = v.parse(g));
				this.rgba = n || []
			},
			get: function(a) {
				var l = this.input,
					n = this.rgba,
					g;
				this.stops ? (g = p(l), g.stops = [].concat(g.stops), D(this.stops, function(n, e) {
					g.stops[e] = [g.stops[e][0], n.get(a)]
				})) : g = n && B(n[0]) ? "rgb" === a || !a && 1 === n[3] ? "rgb(" + n[0] + "," + n[1] + "," + n[2] + ")" : "a" === a ? n[3] : "rgba(" + n.join(",") + ")" : l;
				return g
			},
			brighten: function(a) {
				var l, n = this.rgba;
				if (this.stops) D(this.stops, function(n) {
					n.brighten(a)
				});
				else if (B(a) && 0 !== a) for (l = 0; 3 > l; l++) n[l] += g(255 * a), 0 > n[l] && (n[l] = 0), 255 < n[l] && (n[l] = 255);
				return this
			},
			setOpacity: function(a) {
				this.rgba[3] = a;
				return this
			},
			tweenTo: function(a, g) {
				var n = this.rgba,
					l = a.rgba;
				l.length && n && n.length ? (a = 1 !== l[3] || 1 !== n[3], g = (a ? "rgba(" : "rgb(") + Math.round(l[0] + (n[0] - l[0]) * (1 - g)) + "," + Math.round(l[1] + (n[1] - l[1]) * (1 - g)) + "," + Math.round(l[2] + (n[2] - l[2]) * (1 - g)) + (a ? "," + (l[3] + (n[3] - l[3]) * (1 - g)) : "") + ")") : g = a.input || "none";
				return g
			}
		};
		a.color = function(g) {
			return new a.Color(g)
		}
	})(N);
	(function(a) {
		var D, B, G = a.addEvent,
			p = a.animate,
			g = a.attr,
			l = a.charts,
			r = a.color,
			n = a.css,
			w = a.createElement,
			v = a.defined,
			e = a.deg2rad,
			h = a.destroyObjectProperties,
			m = a.doc,
			c = a.each,
			f = a.extend,
			b = a.erase,
			d = a.grep,
			y = a.hasTouch,
			H = a.inArray,
			J = a.isArray,
			t = a.isFirefox,
			K = a.isMS,
			x = a.isObject,
			C = a.isString,
			L = a.isWebKit,
			q = a.merge,
			A = a.noop,
			E = a.objectEach,
			F = a.pick,
			k = a.pInt,
			u = a.removeEvent,
			R = a.stop,
			M = a.svg,
			P = a.SVG_NS,
			I = a.symbolSizes,
			Q = a.win;
		D = a.SVGElement = function() {
			return this
		};
		f(D.prototype, {
			opacity: 1,
			SVG_NS: P,
			textProps: "direction fontSize fontWeight fontFamily fontStyle color lineHeight width textAlign textDecoration textOverflow textOutline".split(" "),
			init: function(a, k) {
				this.element = "span" === k ? w(k) : m.createElementNS(this.SVG_NS, k);
				this.renderer = a
			},
			animate: function(z, k, b) {
				k = a.animObject(F(k, this.renderer.globalAnimation, !0));
				0 !== k.duration ? (b && (k.complete = b), p(this, z, k)) : (this.attr(z, null, b), k.step && k.step.call(this));
				return this
			},
			colorGradient: function(z, k, b) {
				var u = this.renderer,
					f, O, d, e, y, m, h, M, A, I, x = [],
					t;
				z.radialGradient ? O = "radialGradient" : z.linearGradient && (O = "linearGradient");
				O && (d = z[O], y = u.gradients, h = z.stops, I = b.radialReference, J(d) && (z[O] = d = {
					x1: d[0],
					y1: d[1],
					x2: d[2],
					y2: d[3],
					gradientUnits: "userSpaceOnUse"
				}), "radialGradient" === O && I && !v(d.gradientUnits) && (e = d, d = q(d, u.getRadialAttr(I, e), {
					gradientUnits: "userSpaceOnUse"
				})), E(d, function(a, z) {
					"id" !== z && x.push(z, a)
				}), E(h, function(a) {
					x.push(a)
				}), x = x.join(","), y[x] ? I = y[x].attr("id") : (d.id = I = a.uniqueKey(), y[x] = m = u.createElement(O).attr(d).add(u.defs), m.radAttr = e, m.stops = [], c(h, function(z) {
					0 === z[1].indexOf("rgba") ? (f = a.color(z[1]), M = f.get("rgb"), A = f.get("a")) : (M = z[1], A = 1);
					z = u.createElement("stop").attr({
						offset: z[0],
						"stop-color": M,
						"stop-opacity": A
					}).add(m);
					m.stops.push(z)
				})), t = "url(" + u.url + "#" + I + ")", b.setAttribute(k, t), b.gradient = x, z.toString = function() {
					return t
				})
			},
			applyTextOutline: function(z) {
				var k = this.element,
					u, f, d, q, e; - 1 !== z.indexOf("contrast") && (z = z.replace(/contrast/g, this.renderer.getContrast(k.style.fill)));
				z = z.split(" ");
				f = z[z.length - 1];
				if ((d = z[0]) && "none" !== d && a.svg) {
					this.fakeTS = !0;
					z = [].slice.call(k.getElementsByTagName("tspan"));
					this.ySetter = this.xSetter;
					d = d.replace(/(^[\d\.]+)(.*?)$/g, function(a, z, k) {
						return 2 * z + k
					});
					for (e = z.length; e--;) u = z[e], "highcharts-text-outline" === u.getAttribute("class") && b(z, k.removeChild(u));
					q = k.firstChild;
					c(z, function(a, z) {
						0 === z && (a.setAttribute("x", k.getAttribute("x")), z = k.getAttribute("y"), a.setAttribute("y", z || 0), null === z && k.setAttribute("y", 0));
						a = a.cloneNode(1);
						g(a, {
							"class": "highcharts-text-outline",
							fill: f,
							stroke: f,
							"stroke-width": d,
							"stroke-linejoin": "round"
						});
						k.insertBefore(a, q)
					})
				}
			},
			attr: function(a, k, b, u) {
				var z, f = this.element,
					d, c = this,
					O, q;
				"string" === typeof a && void 0 !== k && (z = a, a = {}, a[z] = k);
				"string" === typeof a ? c = (this[a + "Getter"] || this._defaultGetter).call(this, a, f) : (E(a, function(z, k) {
					O = !1;
					u || R(this, k);
					this.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)$/.test(k) && (d || (this.symbolAttr(a), d = !0), O = !0);
					!this.rotation || "x" !== k && "y" !== k || (this.doTransform = !0);
					O || (q = this[k + "Setter"] || this._defaultSetter, q.call(this, z, k, f), this.shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(k) && this.updateShadows(k, z, q))
				}, this), this.afterSetters());
				b && b();
				return c
			},
			afterSetters: function() {
				this.doTransform && (this.updateTransform(), this.doTransform = !1)
			},
			updateShadows: function(a, k, b) {
				for (var z = this.shadows, u = z.length; u--;) b.call(z[u], "height" === a ? Math.max(k - (z[u].cutHeight || 0), 0) : "d" === a ? this.d : k, a, z[u])
			},
			addClass: function(a, k) {
				var z = this.attr("class") || ""; - 1 === z.indexOf(a) && (k || (a = (z + (z ? " " : "") + a).replace("  ", " ")), this.attr("class", a));
				return this
			},
			hasClass: function(a) {
				return -1 !== H(a, (this.attr("class") || "").split(" "))
			},
			removeClass: function(a) {
				return this.attr("class", (this.attr("class") || "").replace(a, ""))
			},
			symbolAttr: function(a) {
				var z = this;
				c("x y r start end width height innerR anchorX anchorY".split(" "), function(k) {
					z[k] = F(a[k], z[k])
				});
				z.attr({
					d: z.renderer.symbols[z.symbolName](z.x, z.y, z.width, z.height, z)
				})
			},
			clip: function(a) {
				return this.attr("clip-path", a ? "url(" + this.renderer.url + "#" + a.id + ")" : "none")
			},
			crisp: function(a, k) {
				var z = this,
					b = {},
					u;
				k = k || a.strokeWidth || 0;
				u = Math.round(k) % 2 / 2;
				a.x = Math.floor(a.x || z.x || 0) + u;
				a.y = Math.floor(a.y || z.y || 0) + u;
				a.width = Math.floor((a.width || z.width || 0) - 2 * u);
				a.height = Math.floor((a.height || z.height || 0) - 2 * u);
				v(a.strokeWidth) && (a.strokeWidth = k);
				E(a, function(a, k) {
					z[k] !== a && (z[k] = b[k] = a)
				});
				return b
			},
			css: function(a) {
				var z = this.styles,
					b = {},
					u = this.element,
					d, c = "",
					q, e = !z,
					y = ["textOutline", "textOverflow", "width"];
				a && a.color && (a.fill = a.color);
				z && E(a, function(a, k) {
					a !== z[k] && (b[k] = a, e = !0)
				});
				e && (z && (a = f(z, b)), d = this.textWidth = a && a.width && "auto" !== a.width && "text" === u.nodeName.toLowerCase() && k(a.width), this.styles = a, d && !M && this.renderer.forExport && delete a.width, K && !M ? n(this.element, a) : (q = function(a, z) {
					return "-" + z.toLowerCase()
				}, E(a, function(a, z) {
					-1 === H(z, y) && (c += z.replace(/([A-Z])/g, q) + ":" + a + ";")
				}), c && g(u, "style", c)), this.added && ("text" === this.element.nodeName && this.renderer.buildText(this), a && a.textOutline && this.applyTextOutline(a.textOutline)));
				return this
			},
			strokeWidth: function() {
				return this["stroke-width"] || 0
			},
			on: function(a, k) {
				var z = this,
					b = z.element;
				y && "click" === a ? (b.ontouchstart = function(a) {
					z.touchEventFired = Date.now();
					a.preventDefault();
					k.call(b, a)
				}, b.onclick = function(a) {
					(-1 === Q.navigator.userAgent.indexOf("Android") || 1100 < Date.now() - (z.touchEventFired || 0)) && k.call(b, a)
				}) : b["on" + a] = k;
				return this
			},
			setRadialReference: function(a) {
				var z = this.renderer.gradients[this.element.gradient];
				this.element.radialReference = a;
				z && z.radAttr && z.animate(this.renderer.getRadialAttr(a, z.radAttr));
				return this
			},
			translate: function(a, k) {
				return this.attr({
					translateX: a,
					translateY: k
				})
			},
			invert: function(a) {
				this.inverted = a;
				this.updateTransform();
				return this
			},
			updateTransform: function() {
				var a = this.translateX || 0,
					k = this.translateY || 0,
					b = this.scaleX,
					u = this.scaleY,
					f = this.inverted,
					d = this.rotation,
					c = this.matrix,
					q = this.element;
				f && (a += this.width, k += this.height);
				a = ["translate(" + a + "," + k + ")"];
				v(c) && a.push("matrix(" + c.join(",") + ")");
				f ? a.push("rotate(90) scale(-1,1)") : d && a.push("rotate(" + d + " " + F(this.rotationOriginX, q.getAttribute("x"), 0) + " " + F(this.rotationOriginY, q.getAttribute("y") || 0) + ")");
				(v(b) || v(u)) && a.push("scale(" + F(b, 1) + " " + F(u, 1) + ")");
				a.length && q.setAttribute("transform", a.join(" "))
			},
			toFront: function() {
				var a = this.element;
				a.parentNode.appendChild(a);
				return this
			},
			align: function(a, k, u) {
				var z, f, d, c, q = {};
				f = this.renderer;
				d = f.alignedObjects;
				var e, O;
				if (a) {
					if (this.alignOptions = a, this.alignByTranslate = k, !u || C(u)) this.alignTo = z = u || "renderer", b(d, this), d.push(this), u = null
				} else a = this.alignOptions, k = this.alignByTranslate, z = this.alignTo;
				u = F(u, f[z], f);
				z = a.align;
				f = a.verticalAlign;
				d = (u.x || 0) + (a.x || 0);
				c = (u.y || 0) + (a.y || 0);
				"right" === z ? e = 1 : "center" === z && (e = 2);
				e && (d += (u.width - (a.width || 0)) / e);
				q[k ? "translateX" : "x"] = Math.round(d);
				"bottom" === f ? O = 1 : "middle" === f && (O = 2);
				O && (c += (u.height - (a.height || 0)) / O);
				q[k ? "translateY" : "y"] = Math.round(c);
				this[this.placed ? "animate" : "attr"](q);
				this.placed = !0;
				this.alignAttr = q;
				return this
			},
			getBBox: function(a, k) {
				var z, b = this.renderer,
					u, d = this.element,
					q = this.styles,
					O, y = this.textStr,
					m, h = b.cache,
					M = b.cacheKeys,
					A;
				k = F(k, this.rotation);
				u = k * e;
				O = q && q.fontSize;
				v(y) && (A = y.toString(), -1 === A.indexOf("\x3c") && (A = A.replace(/[0-9]/g, "0")), A += ["", k || 0, O, q && q.width, q && q.textOverflow].join());
				A && !a && (z = h[A]);
				if (!z) {
					if (d.namespaceURI === this.SVG_NS || b.forExport) {
						try {
							(m = this.fakeTS &&
							function(a) {
								c(d.querySelectorAll(".highcharts-text-outline"), function(z) {
									z.style.display = a
								})
							}) && m("none"), z = d.getBBox ? f({}, d.getBBox()) : {
								width: d.offsetWidth,
								height: d.offsetHeight
							}, m && m("")
						} catch (W) {}
						if (!z || 0 > z.width) z = {
							width: 0,
							height: 0
						}
					} else z = this.htmlGetBBox();
					b.isSVG && (a = z.width, b = z.height, q && "11px" === q.fontSize && 17 === Math.round(b) && (z.height = b = 14), k && (z.width = Math.abs(b * Math.sin(u)) + Math.abs(a * Math.cos(u)), z.height = Math.abs(b * Math.cos(u)) + Math.abs(a * Math.sin(u))));
					if (A && 0 < z.height) {
						for (; 250 < M.length;) delete h[M.shift()];
						h[A] || M.push(A);
						h[A] = z
					}
				}
				return z
			},
			show: function(a) {
				return this.attr({
					visibility: a ? "inherit" : "visible"
				})
			},
			hide: function() {
				return this.attr({
					visibility: "hidden"
				})
			},
			fadeOut: function(a) {
				var z = this;
				z.animate({
					opacity: 0
				}, {
					duration: a || 150,
					complete: function() {
						z.attr({
							y: -9999
						})
					}
				})
			},
			add: function(a) {
				var z = this.renderer,
					k = this.element,
					b;
				a && (this.parentGroup = a);
				this.parentInverted = a && a.inverted;
				void 0 !== this.textStr && z.buildText(this);
				this.added = !0;
				if (!a || a.handleZ || this.zIndex) b = this.zIndexSetter();
				b || (a ? a.element : z.box).appendChild(k);
				if (this.onAdd) this.onAdd();
				return this
			},
			safeRemoveChild: function(a) {
				var z = a.parentNode;
				z && z.removeChild(a)
			},
			destroy: function() {
				var a = this,
					k = a.element || {},
					u = a.renderer.isSVG && "SPAN" === k.nodeName && a.parentGroup,
					f = k.ownerSVGElement;
				k.onclick = k.onmouseout = k.onmouseover = k.onmousemove = k.point = null;
				R(a);
				a.clipPath && f && (c(f.querySelectorAll("[clip-path],[CLIP-PATH]"), function(k) {
					k.getAttribute("clip-path").match(RegExp('[("]#' + a.clipPath.element.id + '[)"]')) && k.removeAttribute("clip-path")
				}), a.clipPath = a.clipPath.destroy());
				if (a.stops) {
					for (f = 0; f < a.stops.length; f++) a.stops[f] = a.stops[f].destroy();
					a.stops = null
				}
				a.safeRemoveChild(k);
				for (a.destroyShadows(); u && u.div && 0 === u.div.childNodes.length;) k = u.parentGroup, a.safeRemoveChild(u.div), delete u.div, u = k;
				a.alignTo && b(a.renderer.alignedObjects, a);
				E(a, function(k, z) {
					delete a[z]
				});
				return null
			},
			shadow: function(a, k, b) {
				var z = [],
					u, f, d = this.element,
					c, q, e, y;
				if (!a) this.destroyShadows();
				else if (!this.shadows) {
					q = F(a.width, 3);
					e = (a.opacity || .15) / q;
					y = this.parentInverted ? "(-1,-1)" : "(" + F(a.offsetX, 1) + ", " + F(a.offsetY, 1) + ")";
					for (u = 1; u <= q; u++) f = d.cloneNode(0), c = 2 * q + 1 - 2 * u, g(f, {
						isShadow: "true",
						stroke: a.color || "#000000",
						"stroke-opacity": e * u,
						"stroke-width": c,
						transform: "translate" + y,
						fill: "none"
					}), b && (g(f, "height", Math.max(g(f, "height") - c, 0)), f.cutHeight = c), k ? k.element.appendChild(f) : d.parentNode && d.parentNode.insertBefore(f, d), z.push(f);
					this.shadows = z
				}
				return this
			},
			destroyShadows: function() {
				c(this.shadows || [], function(a) {
					this.safeRemoveChild(a)
				}, this);
				this.shadows = void 0
			},
			xGetter: function(a) {
				"circle" === this.element.nodeName && ("x" === a ? a = "cx" : "y" === a && (a = "cy"));
				return this._defaultGetter(a)
			},
			_defaultGetter: function(a) {
				a = F(this[a], this.element ? this.element.getAttribute(a) : null, 0);
				/^[\-0-9\.]+$/.test(a) && (a = parseFloat(a));
				return a
			},
			dSetter: function(a, k, b) {
				a && a.join && (a = a.join(" "));
				/(NaN| {2}|^$)/.test(a) && (a = "M 0 0");
				this[k] !== a && (b.setAttribute(k, a), this[k] = a)
			},
			dashstyleSetter: function(a) {
				var b, u = this["stroke-width"];
				"inherit" === u && (u = 1);
				if (a = a && a.toLowerCase()) {
					a = a.replace("shortdashdotdot", "3,1,1,1,1,1,").replace("shortdashdot", "3,1,1,1").replace("shortdot", "1,1,").replace("shortdash", "3,1,").replace("longdash", "8,3,").replace(/dot/g, "1,3,").replace("dash", "4,3,").replace(/,$/, "").split(",");
					for (b = a.length; b--;) a[b] = k(a[b]) * u;
					a = a.join(",").replace(/NaN/g, "none");
					this.element.setAttribute("stroke-dasharray", a)
				}
			},
			alignSetter: function(a) {
				this.element.setAttribute("text-anchor", {
					left: "start",
					center: "middle",
					right: "end"
				}[a])
			},
			opacitySetter: function(a, k, b) {
				this[k] = a;
				b.setAttribute(k, a)
			},
			titleSetter: function(a) {
				var k = this.element.getElementsByTagName("title")[0];
				k || (k = m.createElementNS(this.SVG_NS, "title"), this.element.appendChild(k));
				k.firstChild && k.removeChild(k.firstChild);
				k.appendChild(m.createTextNode(String(F(a), "").replace(/<[^>]*>/g, "")))
			},
			textSetter: function(a) {
				a !== this.textStr && (delete this.bBox, this.textStr = a, this.added && this.renderer.buildText(this))
			},
			fillSetter: function(a, k, b) {
				"string" === typeof a ? b.setAttribute(k, a) : a && this.colorGradient(a, k, b)
			},
			visibilitySetter: function(a, k, b) {
				"inherit" === a ? b.removeAttribute(k) : this[k] !== a && b.setAttribute(k, a);
				this[k] = a
			},
			zIndexSetter: function(a, b) {
				var u = this.renderer,
					z = this.parentGroup,
					f = (z || u).element || u.box,
					d, c = this.element,
					q, e, u = f === u.box;
				d = this.added;
				var y;
				v(a) && (c.zIndex = a, a = +a, this[b] === a && (d = !1), this[b] = a);
				if (d) {
					(a = this.zIndex) && z && (z.handleZ = !0);
					b = f.childNodes;
					for (y = b.length - 1; 0 <= y && !q; y--) if (z = b[y], d = z.zIndex, e = !v(d), z !== c) if (0 > a && e && !u && !y) f.insertBefore(c, b[y]), q = !0;
					else if (k(d) <= a || e && (!v(a) || 0 <= a)) f.insertBefore(c, b[y + 1] || null), q = !0;
					q || (f.insertBefore(c, b[u ? 3 : 0] || null), q = !0)
				}
				return q
			},
			_defaultSetter: function(a, k, b) {
				b.setAttribute(k, a)
			}
		});
		D.prototype.yGetter = D.prototype.xGetter;
		D.prototype.translateXSetter = D.prototype.translateYSetter = D.prototype.rotationSetter = D.prototype.verticalAlignSetter = D.prototype.rotationOriginXSetter = D.prototype.rotationOriginYSetter = D.prototype.scaleXSetter = D.prototype.scaleYSetter = D.prototype.matrixSetter = function(a, k) {
			this[k] = a;
			this.doTransform = !0
		};
		D.prototype["stroke-widthSetter"] = D.prototype.strokeSetter = function(a, k, b) {
			this[k] = a;
			this.stroke && this["stroke-width"] ? (D.prototype.fillSetter.call(this, this.stroke, "stroke", b), b.setAttribute("stroke-width", this["stroke-width"]), this.hasStroke = !0) : "stroke-width" === k && 0 === a && this.hasStroke && (b.removeAttribute("stroke"), this.hasStroke = !1)
		};
		B = a.SVGRenderer = function() {
			this.init.apply(this, arguments)
		};
		f(B.prototype, {
			Element: D,
			SVG_NS: P,
			init: function(a, k, b, u, f, d) {
				var z;
				u = this.createElement("svg").attr({
					version: "1.1",
					"class": "highcharts-root"
				}).css(this.getStyle(u));
				z = u.element;
				a.appendChild(z);
				g(a, "dir", "ltr"); - 1 === a.innerHTML.indexOf("xmlns") && g(z, "xmlns", this.SVG_NS);
				this.isSVG = !0;
				this.box = z;
				this.boxWrapper = u;
				this.alignedObjects = [];
				this.url = (t || L) && m.getElementsByTagName("base").length ? Q.location.href.replace(/#.*?$/, "").replace(/<[^>]*>/g, "").replace(/([\('\)])/g, "\\$1").replace(/ /g, "%20") : "";
				this.createElement("desc").add().element.appendChild(m.createTextNode("Created with Highcharts 6.0.3"));
				this.defs = this.createElement("defs").add();
				this.allowHTML = d;
				this.forExport = f;
				this.gradients = {};
				this.cache = {};
				this.cacheKeys = [];
				this.imgCount = 0;
				this.setSize(k, b, !1);
				var c;
				t && a.getBoundingClientRect && (k = function() {
					n(a, {
						left: 0,
						top: 0
					});
					c = a.getBoundingClientRect();
					n(a, {
						left: Math.ceil(c.left) - c.left + "px",
						top: Math.ceil(c.top) - c.top + "px"
					})
				}, k(), this.unSubPixelFix = G(Q, "resize", k))
			},
			getStyle: function(a) {
				return this.style = f({
					fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',
					fontSize: "12px"
				}, a)
			},
			setStyle: function(a) {
				this.boxWrapper.css(this.getStyle(a))
			},
			isHidden: function() {
				return !this.boxWrapper.getBBox().width
			},
			destroy: function() {
				var a = this.defs;
				this.box = null;
				this.boxWrapper = this.boxWrapper.destroy();
				h(this.gradients || {});
				this.gradients = null;
				a && (this.defs = a.destroy());
				this.unSubPixelFix && this.unSubPixelFix();
				return this.alignedObjects = null
			},
			createElement: function(a) {
				var k = new this.Element;
				k.init(this, a);
				return k
			},
			draw: A,
			getRadialAttr: function(a, k) {
				return {
					cx: a[0] - a[2] / 2 + k.cx * a[2],
					cy: a[1] - a[2] / 2 + k.cy * a[2],
					r: k.r * a[2]
				}
			},
			getSpanWidth: function(a, k) {
				var b = a.getBBox(!0).width;
				!M && this.forExport && (b = this.measureSpanWidth(k.firstChild.data, a.styles));
				return b
			},
			applyEllipsis: function(a, k, b, u) {
				var f = a.rotation,
					z = b,
					d, c = 0,
					q = b.length,
					e = function(a) {
						k.removeChild(k.firstChild);
						a && k.appendChild(m.createTextNode(a))
					},
					y;
				a.rotation = 0;
				z = this.getSpanWidth(a, k);
				if (y = z > u) {
					for (; c <= q;) d = Math.ceil((c + q) / 2), z = b.substring(0, d) + "\u2026", e(z), z = this.getSpanWidth(a, k), c === q ? c = q + 1 : z > u ? q = d - 1 : c = d;
					0 === q && e("")
				}
				a.rotation = f;
				return y
			},
			escapes: {
				"\x26": "\x26amp;",
				"\x3c": "\x26lt;",
				"\x3e": "\x26gt;",
				"'": "\x26#39;",
				'"': "\x26quot"
			},
			buildText: function(a) {
				var b = a.element,
					u = this,
					f = u.forExport,
					z = F(a.textStr, "").toString(),
					q = -1 !== z.indexOf("\x3c"),
					e = b.childNodes,
					y, h, A, I, x = g(b, "x"),
					t = a.styles,
					H = a.textWidth,
					l = t && t.lineHeight,
					C = t && t.textOutline,
					v = t && "ellipsis" === t.textOverflow,
					R = t && "nowrap" === t.whiteSpace,
					w = t && t.fontSize,
					Q, J, r = e.length,
					t = H && !a.added && this.box,
					K = function(a) {
						var f;
						f = /(px|em)$/.test(a && a.style.fontSize) ? a.style.fontSize : w || u.style.fontSize || 12;
						return l ? k(l) : u.fontMetrics(f, a.getAttribute("style") ? a : b).h
					},
					p = function(a) {
						E(u.escapes, function(k, b) {
							a = a.replace(new RegExp(k, "g"), b)
						});
						return a
					};
				Q = [z, v, R, l, C, w, H].join();
				if (Q !== a.textCache) {
					for (a.textCache = Q; r--;) b.removeChild(e[r]);
					q || C || v || H || -1 !== z.indexOf(" ") ? (y = /<.*class="([^"]+)".*>/, h = /<.*style="([^"]+)".*>/, A = /<.*href="([^"]+)".*>/, t && t.appendChild(b), z = q ? z.replace(/<(b|strong)>/g, '\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g, '\x3cspan style\x3d"font-style:italic"\x3e').replace(/<a/g, "\x3cspan").replace(/<\/(b|strong|i|em|a)>/g, "\x3c/span\x3e").split(/<br.*?>/g) : [z], z = d(z, function(a) {
						return "" !== a
					}), c(z, function(k, z) {
						var d, q = 0;
						k = k.replace(/^\s+|\s+$/g, "").replace(/<span/g, "|||\x3cspan").replace(/<\/span>/g, "\x3c/span\x3e|||");
						d = k.split("|||");
						c(d, function(k) {
							if ("" !== k || 1 === d.length) {
								var c = {},
									e = m.createElementNS(u.SVG_NS, "tspan"),
									t, E;
								y.test(k) && (t = k.match(y)[1], g(e, "class", t));
								h.test(k) && (E = k.match(h)[1].replace(/(;| |^)color([ :])/, "$1fill$2"), g(e, "style", E));
								A.test(k) && !f && (g(e, "onclick", 'location.href\x3d"' + k.match(A)[1] + '"'), g(e, "class", "highcharts-anchor"), n(e, {
									cursor: "pointer"
								}));
								k = p(k.replace(/<[a-zA-Z\/](.|\n)*?>/g, "") || " ");
								if (" " !== k) {
									e.appendChild(m.createTextNode(k));
									q ? c.dx = 0 : z && null !== x && (c.x = x);
									g(e, c);
									b.appendChild(e);
									!q && J && (!M && f && n(e, {
										display: "block"
									}), g(e, "dy", K(e)));
									if (H) {
										c = k.replace(/([^\^])-/g, "$1- ").split(" ");
										t = 1 < d.length || z || 1 < c.length && !R;
										var O = [],
											l, C = K(e),
											F = a.rotation;
										for (v && (I = u.applyEllipsis(a, e, k, H)); !v && t && (c.length || O.length);) a.rotation = 0, l = u.getSpanWidth(a, e), k = l > H, void 0 === I && (I = k), k && 1 !== c.length ? (e.removeChild(e.firstChild), O.unshift(c.pop())) : (c = O, O = [], c.length && !R && (e = m.createElementNS(P, "tspan"), g(e, {
											dy: C,
											x: x
										}), E && g(e, "style", E), b.appendChild(e)), l > H && (H = l)), c.length && e.appendChild(m.createTextNode(c.join(" ").replace(/- /g, "-")));
										a.rotation = F
									}
									q++
								}
							}
						});
						J = J || b.childNodes.length
					}), I && a.attr("title", a.textStr), t && t.removeChild(b), C && a.applyTextOutline && a.applyTextOutline(C)) : b.appendChild(m.createTextNode(p(z)))
				}
			},
			getContrast: function(a) {
				a = r(a).rgba;
				return 510 < a[0] + a[1] + a[2] ? "#000000" : "#FFFFFF"
			},
			button: function(a, k, b, u, d, c, e, y, m) {
				var z = this.label(a, k, b, m, null, null, null, null, "button"),
					h = 0;
				z.attr(q({
					padding: 8,
					r: 2
				}, d));
				var A, M, I, t;
				d = q({
					fill: "#f7f7f7",
					stroke: "#cccccc",
					"stroke-width": 1,
					style: {
						color: "#333333",
						cursor: "pointer",
						fontWeight: "normal"
					}
				}, d);
				A = d.style;
				delete d.style;
				c = q(d, {
					fill: "#e6e6e6"
				}, c);
				M = c.style;
				delete c.style;
				e = q(d, {
					fill: "#e6ebf5",
					style: {
						color: "#000000",
						fontWeight: "bold"
					}
				}, e);
				I = e.style;
				delete e.style;
				y = q(d, {
					style: {
						color: "#cccccc"
					}
				}, y);
				t = y.style;
				delete y.style;
				G(z.element, K ? "mouseover" : "mouseenter", function() {
					3 !== h && z.setState(1)
				});
				G(z.element, K ? "mouseout" : "mouseleave", function() {
					3 !== h && z.setState(h)
				});
				z.setState = function(a) {
					1 !== a && (z.state = h = a);
					z.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-" + ["normal", "hover", "pressed", "disabled"][a || 0]);
					z.attr([d, c, e, y][a || 0]).css([A, M, I, t][a || 0])
				};
				z.attr(d).css(f({
					cursor: "default"
				}, A));
				return z.on("click", function(a) {
					3 !== h && u.call(z, a)
				})
			},
			crispLine: function(a, k) {
				a[1] === a[4] && (a[1] = a[4] = Math.round(a[1]) - k % 2 / 2);
				a[2] === a[5] && (a[2] = a[5] = Math.round(a[2]) + k % 2 / 2);
				return a
			},
			path: function(a) {
				var k = {
					fill: "none"
				};
				J(a) ? k.d = a : x(a) && f(k, a);
				return this.createElement("path").attr(k)
			},
			circle: function(a, k, b) {
				a = x(a) ? a : {
					x: a,
					y: k,
					r: b
				};
				k = this.createElement("circle");
				k.xSetter = k.ySetter = function(a, k, b) {
					b.setAttribute("c" + k, a)
				};
				return k.attr(a)
			},
			arc: function(a, k, b, u, d, f) {
				x(a) ? (u = a, k = u.y, b = u.r, a = u.x) : u = {
					innerR: u,
					start: d,
					end: f
				};
				a = this.symbol("arc", a, k, b, b, u);
				a.r = b;
				return a
			},
			rect: function(a, k, b, u, d, f) {
				d = x(a) ? a.r : d;
				var c = this.createElement("rect");
				a = x(a) ? a : void 0 === a ? {} : {
					x: a,
					y: k,
					width: Math.max(b, 0),
					height: Math.max(u, 0)
				};
				void 0 !== f && (a.strokeWidth = f, a = c.crisp(a));
				a.fill = "none";
				d && (a.r = d);
				c.rSetter = function(a, k, b) {
					g(b, {
						rx: a,
						ry: a
					})
				};
				return c.attr(a)
			},
			setSize: function(a, k, b) {
				var u = this.alignedObjects,
					d = u.length;
				this.width = a;
				this.height = k;
				for (this.boxWrapper.animate({
					width: a,
					height: k
				}, {
					step: function() {
						this.attr({
							viewBox: "0 0 " + this.attr("width") + " " + this.attr("height")
						})
					},
					duration: F(b, !0) ? void 0 : 0
				}); d--;) u[d].align()
			},
			g: function(a) {
				var k = this.createElement("g");
				return a ? k.attr({
					"class": "highcharts-" + a
				}) : k
			},
			image: function(a, k, b, u, d) {
				var c = {
					preserveAspectRatio: "none"
				};
				1 < arguments.length && f(c, {
					x: k,
					y: b,
					width: u,
					height: d
				});
				c = this.createElement("image").attr(c);
				c.element.setAttributeNS ? c.element.setAttributeNS("http://www.w3.org/1999/xlink", "href", a) : c.element.setAttribute("hc-svg-href", a);
				return c
			},
			symbol: function(a, k, b, u, d, q) {
				var e = this,
					z, y = /^url\((.*?)\)$/,
					h = y.test(a),
					A = !h && (this.symbols[a] ? a : "circle"),
					M = A && this.symbols[A],
					t = v(k) && M && M.call(this.symbols, Math.round(k), Math.round(b), u, d, q),
					x, E;
				M ? (z = this.path(t), z.attr("fill", "none"), f(z, {
					symbolName: A,
					x: k,
					y: b,
					width: u,
					height: d
				}), q && f(z, q)) : h && (x = a.match(y)[1], z = this.image(x), z.imgwidth = F(I[x] && I[x].width, q && q.width), z.imgheight = F(I[x] && I[x].height, q && q.height), E = function() {
					z.attr({
						width: z.width,
						height: z.height
					})
				}, c(["width", "height"], function(a) {
					z[a + "Setter"] = function(a, k) {
						var b = {},
							u = this["img" + k],
							d = "width" === k ? "translateX" : "translateY";
						this[k] = a;
						v(u) && (this.element && this.element.setAttribute(k, u), this.alignByTranslate || (b[d] = ((this[k] || 0) - u) / 2, this.attr(b)))
					}
				}), v(k) && z.attr({
					x: k,
					y: b
				}), z.isImg = !0, v(z.imgwidth) && v(z.imgheight) ? E() : (z.attr({
					width: 0,
					height: 0
				}), w("img", {
					onload: function() {
						var a = l[e.chartIndex];
						0 === this.width && (n(this, {
							position: "absolute",
							top: "-999em"
						}), m.body.appendChild(this));
						I[x] = {
							width: this.width,
							height: this.height
						};
						z.imgwidth = this.width;
						z.imgheight = this.height;
						z.element && E();
						this.parentNode && this.parentNode.removeChild(this);
						e.imgCount--;
						if (!e.imgCount && a && a.onload) a.onload()
					},
					src: x
				}), this.imgCount++));
				return z
			},
			symbols: {
				circle: function(a, k, b, u) {
					return this.arc(a + b / 2, k + u / 2, b / 2, u / 2, {
						start: 0,
						end: 2 * Math.PI,
						open: !1
					})
				},
				square: function(a, k, b, u) {
					return ["M", a, k, "L", a + b, k, a + b, k + u, a, k + u, "Z"]
				},
				triangle: function(a, k, b, u) {
					return ["M", a + b / 2, k, "L", a + b, k + u, a, k + u, "Z"]
				},
				"triangle-down": function(a, k, b, u) {
					return ["M", a, k, "L", a + b, k, a + b / 2, k + u, "Z"]
				},
				diamond: function(a, k, b, u) {
					return ["M", a + b / 2, k, "L", a + b, k + u / 2, a + b / 2, k + u, a, k + u / 2, "Z"]
				},
				arc: function(a, k, b, u, d) {
					var f = d.start,
						c = d.r || b,
						q = d.r || u || b,
						e = d.end - .001;
					b = d.innerR;
					u = F(d.open, .001 > Math.abs(d.end - d.start - 2 * Math.PI));
					var z = Math.cos(f),
						y = Math.sin(f),
						h = Math.cos(e),
						e = Math.sin(e);
					d = .001 > d.end - f - Math.PI ? 0 : 1;
					c = ["M", a + c * z, k + q * y, "A", c, q, 0, d, 1, a + c * h, k + q * e];
					v(b) && c.push(u ? "M" : "L", a + b * h, k + b * e, "A", b, b, 0, d, 0, a + b * z, k + b * y);
					c.push(u ? "" : "Z");
					return c
				},
				callout: function(a, k, b, u, d) {
					var f = Math.min(d && d.r || 0, b, u),
						c = f + 6,
						q = d && d.anchorX;
					d = d && d.anchorY;
					var e;
					e = ["M", a + f, k, "L", a + b - f, k, "C", a + b, k, a + b, k, a + b, k + f, "L", a + b, k + u - f, "C", a + b, k + u, a + b, k + u, a + b - f, k + u, "L", a + f, k + u, "C", a, k + u, a, k + u, a, k + u - f, "L", a, k + f, "C", a, k, a, k, a + f, k];
					q && q > b ? d > k + c && d < k + u - c ? e.splice(13, 3, "L", a + b, d - 6, a + b + 6, d, a + b, d + 6, a + b, k + u - f) : e.splice(13, 3, "L", a + b, u / 2, q, d, a + b, u / 2, a + b, k + u - f) : q && 0 > q ? d > k + c && d < k + u - c ? e.splice(33, 3, "L", a, d + 6, a - 6, d, a, d - 6, a, k + f) : e.splice(33, 3, "L", a, u / 2, q, d, a, u / 2, a, k + f) : d && d > u && q > a + c && q < a + b - c ? e.splice(23, 3, "L", q + 6, k + u, q, k + u + 6, q - 6, k + u, a + f, k + u) : d && 0 > d && q > a + c && q < a + b - c && e.splice(3, 3, "L", q - 6, k, q, k - 6, q + 6, k, b - f, k);
					return e
				}
			},
			clipRect: function(k, b, u, d) {
				var f = a.uniqueKey(),
					c = this.createElement("clipPath").attr({
						id: f
					}).add(this.defs);
				k = this.rect(k, b, u, d, 0).add(c);
				k.id = f;
				k.clipPath = c;
				k.count = 0;
				return k
			},
			text: function(a, k, b, u) {
				var d = {};
				if (u && (this.allowHTML || !this.forExport)) return this.html(a, k, b);
				d.x = Math.round(k || 0);
				b && (d.y = Math.round(b));
				if (a || 0 === a) d.text = a;
				a = this.createElement("text").attr(d);
				u || (a.xSetter = function(a, k, b) {
					var u = b.getElementsByTagName("tspan"),
						d, f = b.getAttribute(k),
						c;
					for (c = 0; c < u.length; c++) d = u[c], d.getAttribute(k) === f && d.setAttribute(k, a);
					b.setAttribute(k, a)
				});
				return a
			},
			fontMetrics: function(a, b) {
				a = a || b && b.style && b.style.fontSize || this.style && this.style.fontSize;
				a = /px/.test(a) ? k(a) : /em/.test(a) ? parseFloat(a) * (b ? this.fontMetrics(null, b.parentNode).f : 16) : 12;
				b = 24 > a ? a + 3 : Math.round(1.2 * a);
				return {
					h: b,
					b: Math.round(.8 * b),
					f: a
				}
			},
			rotCorr: function(a, k, b) {
				var u = a;
				k && b && (u = Math.max(u * Math.cos(k * e), 4));
				return {
					x: -a / 3 * Math.sin(k * e),
					y: u
				}
			},
			label: function(k, b, d, e, y, h, m, A, M) {
				var z = this,
					I = z.g("button" !== M && "label"),
					x = I.text = z.text("", 0, 0, m).attr({
						zIndex: 1
					}),
					t, E, H = 0,
					n = 3,
					l = 0,
					g, C, R, F, w, Q = {},
					P, J, r = /^url\((.*?)\)$/.test(e),
					K = r,
					p, O, L, T;
				M && I.addClass("highcharts-" + M);
				K = r;
				p = function() {
					return (P || 0) % 2 / 2
				};
				O = function() {
					var a = x.element.style,
						k = {};
					E = (void 0 === g || void 0 === C || w) && v(x.textStr) && x.getBBox();
					I.width = (g || E.width || 0) + 2 * n + l;
					I.height = (C || E.height || 0) + 2 * n;
					J = n + z.fontMetrics(a && a.fontSize, x).b;
					K && (t || (I.box = t = z.symbols[e] || r ? z.symbol(e) : z.rect(), t.addClass(("button" === M ? "" : "highcharts-label-box") + (M ? " highcharts-" + M + "-box" : "")), t.add(I), a = p(), k.x = a, k.y = (A ? -J : 0) + a), k.width = Math.round(I.width), k.height = Math.round(I.height), t.attr(f(k, Q)), Q = {})
				};
				L = function() {
					var a = l + n,
						k;
					k = A ? 0 : J;
					v(g) && E && ("center" === w || "right" === w) && (a += {
						center: .5,
						right: 1
					}[w] * (g - E.width));
					if (a !== x.x || k !== x.y) x.attr("x", a), void 0 !== k && x.attr("y", k);
					x.x = a;
					x.y = k
				};
				T = function(a, k) {
					t ? t.attr(a, k) : Q[a] = k
				};
				I.onAdd = function() {
					x.add(I);
					I.attr({
						text: k || 0 === k ? k : "",
						x: b,
						y: d
					});
					t && v(y) && I.attr({
						anchorX: y,
						anchorY: h
					})
				};
				I.widthSetter = function(k) {
					g = a.isNumber(k) ? k : null
				};
				I.heightSetter = function(a) {
					C = a
				};
				I["text-alignSetter"] = function(a) {
					w = a
				};
				I.paddingSetter = function(a) {
					v(a) && a !== n && (n = I.padding = a, L())
				};
				I.paddingLeftSetter = function(a) {
					v(a) && a !== l && (l = a, L())
				};
				I.alignSetter = function(a) {
					a = {
						left: 0,
						center: .5,
						right: 1
					}[a];
					a !== H && (H = a, E && I.attr({
						x: R
					}))
				};
				I.textSetter = function(a) {
					void 0 !== a && x.textSetter(a);
					O();
					L()
				};
				I["stroke-widthSetter"] = function(a, k) {
					a && (K = !0);
					P = this["stroke-width"] = a;
					T(k, a)
				};
				I.strokeSetter = I.fillSetter = I.rSetter = function(a, k) {
					"r" !== k && ("fill" === k && a && (K = !0), I[k] = a);
					T(k, a)
				};
				I.anchorXSetter = function(a, k) {
					y = I.anchorX = a;
					T(k, Math.round(a) - p() - R)
				};
				I.anchorYSetter = function(a, k) {
					h = I.anchorY = a;
					T(k, a - F)
				};
				I.xSetter = function(a) {
					I.x = a;
					H && (a -= H * ((g || E.width) + 2 * n));
					R = Math.round(a);
					I.attr("translateX", R)
				};
				I.ySetter = function(a) {
					F = I.y = Math.round(a);
					I.attr("translateY", F)
				};
				var U = I.css;
				return f(I, {
					css: function(a) {
						if (a) {
							var k = {};
							a = q(a);
							c(I.textProps, function(b) {
								void 0 !== a[b] && (k[b] = a[b], delete a[b])
							});
							x.css(k)
						}
						return U.call(I, a)
					},
					getBBox: function() {
						return {
							width: E.width + 2 * n,
							height: E.height + 2 * n,
							x: E.x - n,
							y: E.y - n
						}
					},
					shadow: function(a) {
						a && (O(), t && t.shadow(a));
						return I
					},
					destroy: function() {
						u(I.element, "mouseenter");
						u(I.element, "mouseleave");
						x && (x = x.destroy());
						t && (t = t.destroy());
						D.prototype.destroy.call(I);
						I = z = O = L = T = null
					}
				})
			}
		});
		a.Renderer = B
	})(N);
	(function(a) {
		var D = a.attr,
			B = a.createElement,
			G = a.css,
			p = a.defined,
			g = a.each,
			l = a.extend,
			r = a.isFirefox,
			n = a.isMS,
			w = a.isWebKit,
			v = a.pick,
			e = a.pInt,
			h = a.SVGRenderer,
			m = a.win,
			c = a.wrap;
		l(a.SVGElement.prototype, {
			htmlCss: function(a) {
				var b = this.element;
				if (b = a && "SPAN" === b.tagName && a.width) delete a.width, this.textWidth = b, this.updateTransform();
				a && "ellipsis" === a.textOverflow && (a.whiteSpace = "nowrap", a.overflow = "hidden");
				this.styles = l(this.styles, a);
				G(this.element, a);
				return this
			},
			htmlGetBBox: function() {
				var a = this.element;
				return {
					x: a.offsetLeft,
					y: a.offsetTop,
					width: a.offsetWidth,
					height: a.offsetHeight
				}
			},
			htmlUpdateTransform: function() {
				if (this.added) {
					var a = this.renderer,
						b = this.element,
						d = this.translateX || 0,
						c = this.translateY || 0,
						h = this.x || 0,
						m = this.y || 0,
						t = this.textAlign || "left",
						n = {
							left: 0,
							center: .5,
							right: 1
						}[t],
						x = this.styles;
					G(b, {
						marginLeft: d,
						marginTop: c
					});
					this.shadows && g(this.shadows, function(a) {
						G(a, {
							marginLeft: d + 1,
							marginTop: c + 1
						})
					});
					this.inverted && g(b.childNodes, function(d) {
						a.invertChild(d, b)
					});
					if ("SPAN" === b.tagName) {
						var l = this.rotation,
							v = e(this.textWidth),
							q = x && x.whiteSpace,
							A = [l, t, b.innerHTML, this.textWidth, this.textAlign].join();
						A !== this.cTT && (x = a.fontMetrics(b.style.fontSize).b, p(l) && this.setSpanRotation(l, n, x), G(b, {
							width: "",
							whiteSpace: q || "nowrap"
						}), b.offsetWidth > v && /[ \-]/.test(b.textContent || b.innerText) && G(b, {
							width: v + "px",
							display: "block",
							whiteSpace: q || "normal"
						}), this.getSpanCorrection(b.offsetWidth, x, n, l, t));
						G(b, {
							left: h + (this.xCorr || 0) + "px",
							top: m + (this.yCorr || 0) + "px"
						});
						w && (x = b.offsetHeight);
						this.cTT = A
					}
				} else this.alignOnAdd = !0
			},
			setSpanRotation: function(a, b, d) {
				var c = {},
					f = this.renderer.getTransformKey();
				c[f] = c.transform = "rotate(" + a + "deg)";
				c[f + (r ? "Origin" : "-origin")] = c.transformOrigin = 100 * b + "% " + d + "px";
				G(this.element, c)
			},
			getSpanCorrection: function(a, b, d) {
				this.xCorr = -a * d;
				this.yCorr = -b
			}
		});
		l(h.prototype, {
			getTransformKey: function() {
				return n && !/Edge/.test(m.navigator.userAgent) ? "-ms-transform" : w ? "-webkit-transform" : r ? "MozTransform" : m.opera ? "-o-transform" : ""
			},
			html: function(a, b, d) {
				var f = this.createElement("span"),
					e = f.element,
					h = f.renderer,
					m = h.isSVG,
					w = function(a, b) {
						g(["opacity", "visibility"], function(d) {
							c(a, d + "Setter", function(a, d, f, c) {
								a.call(this, d, f, c);
								b[f] = d
							})
						})
					};
				f.textSetter = function(a) {
					a !== e.innerHTML && delete this.bBox;
					this.textStr = a;
					e.innerHTML = v(a, "");
					f.htmlUpdateTransform()
				};
				m && w(f, f.element.style);
				f.xSetter = f.ySetter = f.alignSetter = f.rotationSetter = function(a, b) {
					"align" === b && (b = "textAlign");
					f[b] = a;
					f.htmlUpdateTransform()
				};
				f.attr({
					text: a,
					x: Math.round(b),
					y: Math.round(d)
				}).css({
					fontFamily: this.style.fontFamily,
					fontSize: this.style.fontSize,
					position: "absolute"
				});
				e.style.whiteSpace = "nowrap";
				f.css = f.htmlCss;
				m && (f.add = function(a) {
					var b, d = h.box.parentNode,
						c = [];
					if (this.parentGroup = a) {
						if (b = a.div, !b) {
							for (; a;) c.push(a), a = a.parentGroup;
							g(c.reverse(), function(a) {
								function e(k, b) {
									a[b] = k;
									n ? q[h.getTransformKey()] = "translate(" + (a.x || a.translateX) + "px," + (a.y || a.translateY) + "px)" : "translateX" === b ? q.left = k + "px" : q.top = k + "px";
									a.doTransform = !0
								}
								var q, k = D(a.element, "class");
								k && (k = {
									className: k
								});
								b = a.div = a.div || B("div", k, {
									position: "absolute",
									left: (a.translateX || 0) + "px",
									top: (a.translateY || 0) + "px",
									display: a.display,
									opacity: a.opacity,
									pointerEvents: a.styles && a.styles.pointerEvents
								}, b || d);
								q = b.style;
								l(a, {
									classSetter: function(a) {
										this.element.setAttribute("class", a);
										b.className = a
									},
									on: function() {
										c[0].div && f.on.apply({
											element: c[0].div
										}, arguments);
										return a
									},
									translateXSetter: e,
									translateYSetter: e
								});
								w(a, q)
							})
						}
					} else b = d;
					b.appendChild(e);
					f.added = !0;
					f.alignOnAdd && f.htmlUpdateTransform();
					return f
				});
				return f
			}
		})
	})(N);
	(function(a) {
		function D() {
			var n = a.defaultOptions.global,
				l = r.moment;
			if (n.timezone) {
				if (l) return function(a) {
					return -l.tz(a, n.timezone).utcOffset()
				};
				a.error(25)
			}
			return n.useUTC && n.getTimezoneOffset
		}
		function B() {
			var n = a.defaultOptions.global,
				g, v = n.useUTC,
				e = v ? "getUTC" : "get",
				h = v ? "setUTC" : "set",
				m = "Minutes Hours Day Date Month FullYear".split(" "),
				c = m.concat(["Milliseconds", "Seconds"]);
			a.Date = g = n.Date || r.Date;
			g.hcTimezoneOffset = v && n.timezoneOffset;
			g.hcGetTimezoneOffset = D();
			g.hcMakeTime = function(a, b, d, c, e, h) {
				var f;
				v ? (f = g.UTC.apply(0, arguments), f += p(f)) : f = (new g(a, b, l(d, 1), l(c, 0), l(e, 0), l(h, 0))).getTime();
				return f
			};
			for (n = 0; n < m.length; n++) g["hcGet" + m[n]] = e + m[n];
			for (n = 0; n < c.length; n++) g["hcSet" + c[n]] = h + c[n]
		}
		var G = a.color,
			p = a.getTZOffset,
			g = a.merge,
			l = a.pick,
			r = a.win;
		a.defaultOptions = {
			colors: "#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "),
			symbols: ["circle", "diamond", "square", "triangle", "triangle-down"],
			lang: {
				loading: "Loading...",
				months: "January February March April May June July August September October November December".split(" "),
				shortMonths: "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),
				weekdays: "Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),
				decimalPoint: ".",
				numericSymbols: "kMGTPE".split(""),
				resetZoom: "Reset zoom",
				resetZoomTitle: "Reset zoom level 1:1",
				thousandsSep: " "
			},
			global: {
				useUTC: !0
			},
			chart: {
				borderRadius: 0,
				defaultSeriesType: "line",
				ignoreHiddenSeries: !0,
				spacing: [10, 10, 15, 10],
				resetZoomButton: {
					theme: {
						zIndex: 20
					},
					position: {
						align: "right",
						x: -10,
						y: 10
					}
				},
				width: null,
				height: null,
				borderColor: "#335cad",
				backgroundColor: "#ffffff",
				plotBorderColor: "#cccccc"
			},
			title: {
				text: "Chart title",
				align: "center",
				margin: 15,
				widthAdjust: -44
			},
			subtitle: {
				text: "",
				align: "center",
				widthAdjust: -44
			},
			plotOptions: {},
			labels: {
				style: {
					position: "absolute",
					color: "#333333"
				}
			},
			legend: {
				enabled: !0,
				align: "center",
				layout: "horizontal",
				labelFormatter: function() {
					return this.name
				},
				borderColor: "#999999",
				borderRadius: 0,
				navigation: {
					activeColor: "#003399",
					inactiveColor: "#cccccc"
				},
				itemStyle: {
					color: "#333333",
					fontSize: "12px",
					fontWeight: "bold",
					textOverflow: "ellipsis"
				},
				itemHoverStyle: {
					color: "#000000"
				},
				itemHiddenStyle: {
					color: "#cccccc"
				},
				shadow: !1,
				itemCheckboxStyle: {
					position: "absolute",
					width: "13px",
					height: "13px"
				},
				squareSymbol: !0,
				symbolPadding: 5,
				verticalAlign: "bottom",
				x: 0,
				y: 0,
				title: {
					style: {
						fontWeight: "bold"
					}
				}
			},
			loading: {
				labelStyle: {
					fontWeight: "bold",
					position: "relative",
					top: "45%"
				},
				style: {
					position: "absolute",
					backgroundColor: "#ffffff",
					opacity: .5,
					textAlign: "center"
				}
			},
			tooltip: {
				enabled: !0,
				animation: a.svg,
				borderRadius: 3,
				dateTimeLabelFormats: {
					millisecond: "%A, %b %e, %H:%M:%S.%L",
					second: "%A, %b %e, %H:%M:%S",
					minute: "%A, %b %e, %H:%M",
					hour: "%A, %b %e, %H:%M",
					day: "%A, %b %e, %Y",
					week: "Week from %A, %b %e, %Y",
					month: "%B %Y",
					year: "%Y"
				},
				footerFormat: "",
				padding: 8,
				snap: a.isTouchDevice ? 25 : 10,
				backgroundColor: G("#f7f7f7").setOpacity(.85).get(),
				borderWidth: 1,
				headerFormat: '\x3cspan style\x3d"font-size: 10px"\x3e{point.key}\x3c/span\x3e\x3cbr/\x3e',
				pointFormat: '\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e',
				shadow: !0,
				style: {
					color: "#333333",
					cursor: "default",
					fontSize: "12px",
					pointerEvents: "none",
					whiteSpace: "nowrap"
				}
			},
			credits: {
				enabled: !0,
				href: "http://www.highcharts.com",
				position: {
					align: "right",
					x: -10,
					verticalAlign: "bottom",
					y: -5
				},
				style: {
					cursor: "pointer",
					color: "#999999",
					fontSize: "9px"
				},
				text: ""
			}
		};
		a.setOptions = function(n) {
			a.defaultOptions = g(!0, a.defaultOptions, n);
			B();
			return a.defaultOptions
		};
		a.getOptions = function() {
			return a.defaultOptions
		};
		a.defaultPlotOptions = a.defaultOptions.plotOptions;
		B()
	})(N);
	(function(a) {
		var D = a.correctFloat,
			B = a.defined,
			G = a.destroyObjectProperties,
			p = a.isNumber,
			g = a.merge,
			l = a.pick,
			r = a.deg2rad;
		a.Tick = function(a, g, l, e) {
			this.axis = a;
			this.pos = g;
			this.type = l || "";
			this.isNewLabel = this.isNew = !0;
			l || e || this.addLabel()
		};
		a.Tick.prototype = {
			addLabel: function() {
				var a = this.axis,
					w = a.options,
					v = a.chart,
					e = a.categories,
					h = a.names,
					m = this.pos,
					c = w.labels,
					f = a.tickPositions,
					b = m === f[0],
					d = m === f[f.length - 1],
					h = e ? l(e[m], h[m], m) : m,
					e = this.label,
					f = f.info,
					y;
				a.isDatetimeAxis && f && (y = w.dateTimeLabelFormats[f.higherRanks[m] || f.unitName]);
				this.isFirst = b;
				this.isLast = d;
				w = a.labelFormatter.call({
					axis: a,
					chart: v,
					isFirst: b,
					isLast: d,
					dateTimeLabelFormat: y,
					value: a.isLog ? D(a.lin2log(h)) : h,
					pos: m
				});
				B(e) ? e && e.attr({
					text: w
				}) : (this.labelLength = (this.label = e = B(w) && c.enabled ? v.renderer.text(w, 0, 0, c.useHTML).css(g(c.style)).add(a.labelGroup) : null) && e.getBBox().width, this.rotation = 0)
			},
			getLabelSize: function() {
				return this.label ? this.label.getBBox()[this.axis.horiz ? "height" : "width"] : 0
			},
			handleOverflow: function(a) {
				var g = this.axis,
					n = a.x,
					e = g.chart.chartWidth,
					h = g.chart.spacing,
					m = l(g.labelLeft, Math.min(g.pos, h[3])),
					h = l(g.labelRight, Math.max(g.pos + g.len, e - h[1])),
					c = this.label,
					f = this.rotation,
					b = {
						left: 0,
						center: .5,
						right: 1
					}[g.labelAlign],
					d = c.getBBox().width,
					y = g.getSlotWidth(),
					H = y,
					J = 1,
					t, p = {};
				if (f) 0 > f && n - b * d < m ? t = Math.round(n / Math.cos(f * r) - m) : 0 < f && n + b * d > h && (t = Math.round((e - n) / Math.cos(f * r)));
				else if (e = n + (1 - b) * d, n - b * d < m ? H = a.x + H * (1 - b) - m : e > h && (H = h - a.x + H * b, J = -1), H = Math.min(y, H), H < y && "center" === g.labelAlign && (a.x += J * (y - H - b * (y - Math.min(d, H)))), d > H || g.autoRotation && (c.styles || {}).width) t = H;
				t && (p.width = t, (g.options.labels.style || {}).textOverflow || (p.textOverflow = "ellipsis"), c.css(p))
			},
			getPosition: function(a, g, l, e) {
				var h = this.axis,
					m = h.chart,
					c = e && m.oldChartHeight || m.chartHeight;
				return {
					x: a ? h.translate(g + l, null, null, e) + h.transB : h.left + h.offset + (h.opposite ? (e && m.oldChartWidth || m.chartWidth) - h.right - h.left : 0),
					y: a ? c - h.bottom + h.offset - (h.opposite ? h.height : 0) : c - h.translate(g + l, null, null, e) - h.transB
				}
			},
			getLabelPosition: function(a, g, l, e, h, m, c, f) {
				var b = this.axis,
					d = b.transA,
					y = b.reversed,
					n = b.staggerLines,
					v = b.tickRotCorr || {
						x: 0,
						y: 0
					},
					t = h.y;
				B(t) || (t = 0 === b.side ? l.rotation ? -8 : -l.getBBox().height : 2 === b.side ? v.y + 8 : Math.cos(l.rotation * r) * (v.y - l.getBBox(!1, 0).height / 2));
				a = a + h.x + v.x - (m && e ? m * d * (y ? -1 : 1) : 0);
				g = g + t - (m && !e ? m * d * (y ? 1 : -1) : 0);
				n && (l = c / (f || 1) % n, b.opposite && (l = n - l - 1), g += b.labelOffset / n * l);
				return {
					x: a,
					y: Math.round(g)
				}
			},
			getMarkPath: function(a, g, l, e, h, m) {
				return m.crispLine(["M", a, g, "L", a + (h ? 0 : -l), g + (h ? l : 0)], e)
			},
			renderGridLine: function(a, g, l) {
				var e = this.axis,
					h = e.options,
					m = this.gridLine,
					c = {},
					f = this.pos,
					b = this.type,
					d = e.tickmarkOffset,
					y = e.chart.renderer,
					n = b ? b + "Grid" : "grid",
					v = h[n + "LineWidth"],
					t = h[n + "LineColor"],
					h = h[n + "LineDashStyle"];
				m || (c.stroke = t, c["stroke-width"] = v, h && (c.dashstyle = h), b || (c.zIndex = 1), a && (c.opacity = 0), this.gridLine = m = y.path().attr(c).addClass("highcharts-" + (b ? b + "-" : "") + "grid-line").add(e.gridGroup));
				if (!a && m && (a = e.getPlotLinePath(f + d, m.strokeWidth() * l, a, !0))) m[this.isNew ? "attr" : "animate"]({
					d: a,
					opacity: g
				})
			},
			renderMark: function(a, g, v) {
				var e = this.axis,
					h = e.options,
					m = e.chart.renderer,
					c = this.type,
					f = c ? c + "Tick" : "tick",
					b = e.tickSize(f),
					d = this.mark,
					y = !d,
					n = a.x;
				a = a.y;
				var r = l(h[f + "Width"], !c && e.isXAxis ? 1 : 0),
					h = h[f + "Color"];
				b && (e.opposite && (b[0] = -b[0]), y && (this.mark = d = m.path().addClass("highcharts-" + (c ? c + "-" : "") + "tick").add(e.axisGroup), d.attr({
					stroke: h,
					"stroke-width": r
				})), d[y ? "attr" : "animate"]({
					d: this.getMarkPath(n, a, b[0], d.strokeWidth() * v, e.horiz, m),
					opacity: g
				}))
			},
			renderLabel: function(a, g, v, e) {
				var h = this.axis,
					m = h.horiz,
					c = h.options,
					f = this.label,
					b = c.labels,
					d = b.step,
					y = h.tickmarkOffset,
					H = !0,
					n = a.x;
				a = a.y;
				f && p(n) && (f.xy = a = this.getLabelPosition(n, a, f, m, b, y, e, d), this.isFirst && !this.isLast && !l(c.showFirstLabel, 1) || this.isLast && !this.isFirst && !l(c.showLastLabel, 1) ? H = !1 : !m || h.isRadial || b.step || b.rotation || g || 0 === v || this.handleOverflow(a), d && e % d && (H = !1), H && p(a.y) ? (a.opacity = v, f[this.isNewLabel ? "attr" : "animate"](a), this.isNewLabel = !1) : (f.attr("y", -9999), this.isNewLabel = !0))
			},
			render: function(a, g, v) {
				var e = this.axis,
					h = e.horiz,
					m = this.getPosition(h, this.pos, e.tickmarkOffset, g),
					c = m.x,
					f = m.y,
					e = h && c === e.pos + e.len || !h && f === e.pos ? -1 : 1;
				v = l(v, 1);
				this.isActive = !0;
				this.renderGridLine(g, v, e);
				this.renderMark(m, v, e);
				this.renderLabel(m, g, v, a);
				this.isNew = !1
			},
			destroy: function() {
				G(this, this.axis)
			}
		}
	})(N);
	var V = function(a) {
			var D = a.addEvent,
				B = a.animObject,
				G = a.arrayMax,
				p = a.arrayMin,
				g = a.color,
				l = a.correctFloat,
				r = a.defaultOptions,
				n = a.defined,
				w = a.deg2rad,
				v = a.destroyObjectProperties,
				e = a.each,
				h = a.extend,
				m = a.fireEvent,
				c = a.format,
				f = a.getMagnitude,
				b = a.grep,
				d = a.inArray,
				y = a.isArray,
				H = a.isNumber,
				J = a.isString,
				t = a.merge,
				K = a.normalizeTickInterval,
				x = a.objectEach,
				C = a.pick,
				L = a.removeEvent,
				q = a.splat,
				A = a.syncTimeout,
				E = a.Tick,
				F = function() {
					this.init.apply(this, arguments)
				};
			a.extend(F.prototype, {
				defaultOptions: {
					dateTimeLabelFormats: {
						millisecond: "%H:%M:%S.%L",
						second: "%H:%M:%S",
						minute: "%H:%M",
						hour: "%H:%M",
						day: "%e. %b",
						week: "%e. %b",
						month: "%b '%y",
						year: "%Y"
					},
					endOnTick: !1,
					labels: {
						enabled: !0,
						style: {
							color: "#666666",
							cursor: "default",
							fontSize: "11px"
						},
						x: 0
					},
					maxPadding: .01,
					minorTickLength: 2,
					minorTickPosition: "outside",
					minPadding: .01,
					startOfWeek: 1,
					startOnTick: !1,
					tickLength: 10,
					tickmarkPlacement: "between",
					tickPixelInterval: 100,
					tickPosition: "outside",
					title: {
						align: "middle",
						style: {
							color: "#666666"
						}
					},
					type: "linear",
					minorGridLineColor: "#f2f2f2",
					minorGridLineWidth: 1,
					minorTickColor: "#999999",
					lineColor: "#ccd6eb",
					lineWidth: 1,
					gridLineColor: "#e6e6e6",
					tickColor: "#ccd6eb"
				},
				defaultYAxisOptions: {
					endOnTick: !0,
					tickPixelInterval: 72,
					showLastLabel: !0,
					labels: {
						x: -8
					},
					maxPadding: .05,
					minPadding: .05,
					startOnTick: !0,
					title: {
						rotation: 270,
						text: "Values"
					},
					stackLabels: {
						allowOverlap: !1,
						enabled: !1,
						formatter: function() {
							return a.numberFormat(this.total, -1)
						},
						style: {
							fontSize: "11px",
							fontWeight: "bold",
							color: "#000000",
							textOutline: "1px contrast"
						}
					},
					gridLineWidth: 1,
					lineWidth: 0
				},
				defaultLeftAxisOptions: {
					labels: {
						x: -15
					},
					title: {
						rotation: 270
					}
				},
				defaultRightAxisOptions: {
					labels: {
						x: 15
					},
					title: {
						rotation: 90
					}
				},
				defaultBottomAxisOptions: {
					labels: {
						autoRotation: [-45],
						x: 0
					},
					title: {
						rotation: 0
					}
				},
				defaultTopAxisOptions: {
					labels: {
						autoRotation: [-45],
						x: 0
					},
					title: {
						rotation: 0
					}
				},
				init: function(a, b) {
					var k = b.isX,
						u = this;
					u.chart = a;
					u.horiz = a.inverted && !u.isZAxis ? !k : k;
					u.isXAxis = k;
					u.coll = u.coll || (k ? "xAxis" : "yAxis");
					u.opposite = b.opposite;
					u.side = b.side || (u.horiz ? u.opposite ? 0 : 2 : u.opposite ? 1 : 3);
					u.setOptions(b);
					var f = this.options,
						c = f.type;
					u.labelFormatter = f.labels.formatter || u.defaultLabelFormatter;
					u.userOptions = b;
					u.minPixelPadding = 0;
					u.reversed = f.reversed;
					u.visible = !1 !== f.visible;
					u.zoomEnabled = !1 !== f.zoomEnabled;
					u.hasNames = "category" === c || !0 === f.categories;
					u.categories = f.categories || u.hasNames;
					u.names = u.names || [];
					u.plotLinesAndBandsGroups = {};
					u.isLog = "logarithmic" === c;
					u.isDatetimeAxis = "datetime" === c;
					u.positiveValuesOnly = u.isLog && !u.allowNegativeLog;
					u.isLinked = n(f.linkedTo);
					u.ticks = {};
					u.labelEdge = [];
					u.minorTicks = {};
					u.plotLinesAndBands = [];
					u.alternateBands = {};
					u.len = 0;
					u.minRange = u.userMinRange = f.minRange || f.maxZoom;
					u.range = f.range;
					u.offset = f.offset || 0;
					u.stacks = {};
					u.oldStacks = {};
					u.stacksTouched = 0;
					u.max = null;
					u.min = null;
					u.crosshair = C(f.crosshair, q(a.options.tooltip.crosshairs)[k ? 0 : 1], !1);
					b = u.options.events; - 1 === d(u, a.axes) && (k ? a.axes.splice(a.xAxis.length, 0, u) : a.axes.push(u), a[u.coll].push(u));
					u.series = u.series || [];
					a.inverted && !u.isZAxis && k && void 0 === u.reversed && (u.reversed = !0);
					x(b, function(a, k) {
						D(u, k, a)
					});
					u.lin2log = f.linearToLogConverter || u.lin2log;
					u.isLog && (u.val2lin = u.log2lin, u.lin2val = u.lin2log)
				},
				setOptions: function(a) {
					this.options = t(this.defaultOptions, "yAxis" === this.coll && this.defaultYAxisOptions, [this.defaultTopAxisOptions, this.defaultRightAxisOptions, this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side], t(r[this.coll], a))
				},
				defaultLabelFormatter: function() {
					var k = this.axis,
						b = this.value,
						d = k.categories,
						f = this.dateTimeLabelFormat,
						e = r.lang,
						q = e.numericSymbols,
						e = e.numericSymbolMagnitude || 1E3,
						h = q && q.length,
						m, y = k.options.labels.format,
						k = k.isLog ? Math.abs(b) : k.tickInterval;
					if (y) m = c(y, this);
					else if (d) m = b;
					else if (f) m = a.dateFormat(f, b);
					else if (h && 1E3 <= k) for (; h-- && void 0 === m;) d = Math.pow(e, h + 1), k >= d && 0 === 10 * b % d && null !== q[h] && 0 !== b && (m = a.numberFormat(b / d, -1) + q[h]);
					void 0 === m && (m = 1E4 <= Math.abs(b) ? a.numberFormat(b, -1) : a.numberFormat(b, -1, void 0, ""));
					return m
				},
				getSeriesExtremes: function() {
					var a = this,
						u = a.chart;
					a.hasVisibleSeries = !1;
					a.dataMin = a.dataMax = a.threshold = null;
					a.softThreshold = !a.isXAxis;
					a.buildStacks && a.buildStacks();
					e(a.series, function(k) {
						if (k.visible || !u.options.chart.ignoreHiddenSeries) {
							var d = k.options,
								f = d.threshold,
								c;
							a.hasVisibleSeries = !0;
							a.positiveValuesOnly && 0 >= f && (f = null);
							if (a.isXAxis) d = k.xData, d.length && (k = p(d), c = G(d), H(k) || k instanceof Date || (d = b(d, H), k = p(d)), a.dataMin = Math.min(C(a.dataMin, d[0], k), k), a.dataMax = Math.max(C(a.dataMax, d[0], c), c));
							else if (k.getExtremes(), c = k.dataMax, k = k.dataMin, n(k) && n(c) && (a.dataMin = Math.min(C(a.dataMin, k), k), a.dataMax = Math.max(C(a.dataMax, c), c)), n(f) && (a.threshold = f), !d.softThreshold || a.positiveValuesOnly) a.softThreshold = !1
						}
					})
				},
				translate: function(a, b, d, f, c, e) {
					var k = this.linkedParent || this,
						u = 1,
						q = 0,
						h = f ? k.oldTransA : k.transA;
					f = f ? k.oldMin : k.min;
					var m = k.minPixelPadding;
					c = (k.isOrdinal || k.isBroken || k.isLog && c) && k.lin2val;
					h || (h = k.transA);
					d && (u *= -1, q = k.len);
					k.reversed && (u *= -1, q -= u * (k.sector || k.len));
					b ? (a = (a * u + q - m) / h + f, c && (a = k.lin2val(a))) : (c && (a = k.val2lin(a)), a = H(f) ? u * (a - f) * h + q + u * m + (H(e) ? h * e : 0) : void 0);
					return a
				},
				toPixels: function(a, b) {
					return this.translate(a, !1, !this.horiz, null, !0) + (b ? 0 : this.pos)
				},
				toValue: function(a, b) {
					return this.translate(a - (b ? 0 : this.pos), !0, !this.horiz, null, !0)
				},
				getPlotLinePath: function(a, b, d, f, c) {
					var k = this.chart,
						u = this.left,
						q = this.top,
						e, h, m = d && k.oldChartHeight || k.chartHeight,
						y = d && k.oldChartWidth || k.chartWidth,
						A;
					e = this.transB;
					var t = function(a, k, b) {
							if (a < k || a > b) f ? a = Math.min(Math.max(k, a), b) : A = !0;
							return a
						};
					c = C(c, this.translate(a, null, null, d));
					a = d = Math.round(c + e);
					e = h = Math.round(m - c - e);
					H(c) ? this.horiz ? (e = q, h = m - this.bottom, a = d = t(a, u, u + this.width)) : (a = u, d = y - this.right, e = h = t(e, q, q + this.height)) : (A = !0, f = !1);
					return A && !f ? null : k.renderer.crispLine(["M", a, e, "L", d, h], b || 1)
				},
				getLinearTickPositions: function(a, b, d) {
					var k, u = l(Math.floor(b / a) * a);
					d = l(Math.ceil(d / a) * a);
					var f = [],
						c;
					l(u + a) === u && (c = 20);
					if (this.single) return [b];
					for (b = u; b <= d;) {
						f.push(b);
						b = l(b + a, c);
						if (b === k) break;
						k = b
					}
					return f
				},
				getMinorTickInterval: function() {
					var a = this.options;
					return !0 === a.minorTicks ? C(a.minorTickInterval, "auto") : !1 === a.minorTicks ? null : a.minorTickInterval
				},
				getMinorTickPositions: function() {
					var a = this,
						b = a.options,
						d = a.tickPositions,
						f = a.minorTickInterval,
						c = [],
						q = a.pointRangePadding || 0,
						h = a.min - q,
						q = a.max + q,
						m = q - h;
					if (m && m / f < a.len / 3) if (a.isLog) e(this.paddedTicks, function(k, b, u) {
						b && c.push.apply(c, a.getLogTickPositions(f, u[b - 1], u[b], !0))
					});
					else if (a.isDatetimeAxis && "auto" === this.getMinorTickInterval()) c = c.concat(a.getTimeTicks(a.normalizeTimeTickInterval(f), h, q, b.startOfWeek));
					else for (b = h + (d[0] - h) % f; b <= q && b !== c[0]; b += f) c.push(b);
					0 !== c.length && a.trimTicks(c);
					return c
				},
				adjustForMinRange: function() {
					var a = this.options,
						b = this.min,
						d = this.max,
						f, c, q, h, m, y, A, t;
					this.isXAxis && void 0 === this.minRange && !this.isLog && (n(a.min) || n(a.max) ? this.minRange = null : (e(this.series, function(a) {
						y = a.xData;
						for (h = A = a.xIncrement ? 1 : y.length - 1; 0 < h; h--) if (m = y[h] - y[h - 1], void 0 === q || m < q) q = m
					}), this.minRange = Math.min(5 * q, this.dataMax - this.dataMin)));
					d - b < this.minRange && (c = this.dataMax - this.dataMin >= this.minRange, t = this.minRange, f = (t - d + b) / 2, f = [b - f, C(a.min, b - f)], c && (f[2] = this.isLog ? this.log2lin(this.dataMin) : this.dataMin), b = G(f), d = [b + t, C(a.max, b + t)], c && (d[2] = this.isLog ? this.log2lin(this.dataMax) : this.dataMax), d = p(d), d - b < t && (f[0] = d - t, f[1] = C(a.min, d - t), b = G(f)));
					this.min = b;
					this.max = d
				},
				getClosest: function() {
					var a;
					this.categories ? a = 1 : e(this.series, function(k) {
						var b = k.closestPointRange,
							u = k.visible || !k.chart.options.chart.ignoreHiddenSeries;
						!k.noSharedTooltip && n(b) && u && (a = n(a) ? Math.min(a, b) : b)
					});
					return a
				},
				nameToX: function(a) {
					var k = y(this.categories),
						b = k ? this.categories : this.names,
						f = a.options.x,
						c;
					a.series.requireSorting = !1;
					n(f) || (f = !1 === this.options.uniqueNames ? a.series.autoIncrement() : d(a.name, b)); - 1 === f ? k || (c = b.length) : c = f;
					void 0 !== c && (this.names[c] = a.name);
					return c
				},
				updateNames: function() {
					var a = this;
					0 < this.names.length && (this.names.length = 0, this.minRange = this.userMinRange, e(this.series || [], function(k) {
						k.xIncrement = null;
						if (!k.points || k.isDirtyData) k.processData(), k.generatePoints();
						e(k.points, function(b, u) {
							var d;
							b.options && (d = a.nameToX(b), void 0 !== d && d !== b.x && (b.x = d, k.xData[u] = d))
						})
					}))
				},
				setAxisTranslation: function(a) {
					var k = this,
						b = k.max - k.min,
						d = k.axisPointRange || 0,
						f, c = 0,
						q = 0,
						h = k.linkedParent,
						m = !! k.categories,
						y = k.transA,
						A = k.isXAxis;
					if (A || m || d) f = k.getClosest(), h ? (c = h.minPointOffset, q = h.pointRangePadding) : e(k.series, function(a) {
						var b = m ? 1 : A ? C(a.options.pointRange, f, 0) : k.axisPointRange || 0;
						a = a.options.pointPlacement;
						d = Math.max(d, b);
						k.single || (c = Math.max(c, J(a) ? 0 : b / 2), q = Math.max(q, "on" === a ? 0 : b))
					}), h = k.ordinalSlope && f ? k.ordinalSlope / f : 1, k.minPointOffset = c *= h, k.pointRangePadding = q *= h, k.pointRange = Math.min(d, b), A && (k.closestPointRange = f);
					a && (k.oldTransA = y);
					k.translationSlope = k.transA = y = k.options.staticScale || k.len / (b + q || 1);
					k.transB = k.horiz ? k.left : k.bottom;
					k.minPixelPadding = y * c
				},
				minFromRange: function() {
					return this.max - this.range
				},
				setTickInterval: function(k) {
					var b = this,
						d = b.chart,
						c = b.options,
						q = b.isLog,
						h = b.log2lin,
						y = b.isDatetimeAxis,
						A = b.isXAxis,
						t = b.isLinked,
						x = c.maxPadding,
						g = c.minPadding,
						E = c.tickInterval,
						v = c.tickPixelInterval,
						F = b.categories,
						r = b.threshold,
						J = b.softThreshold,
						p, w, L, B;
					y || F || t || this.getTickAmount();
					L = C(b.userMin, c.min);
					B = C(b.userMax, c.max);
					t ? (b.linkedParent = d[b.coll][c.linkedTo], d = b.linkedParent.getExtremes(), b.min = C(d.min, d.dataMin), b.max = C(d.max, d.dataMax), c.type !== b.linkedParent.options.type && a.error(11, 1)) : (!J && n(r) && (b.dataMin >= r ? (p = r, g = 0) : b.dataMax <= r && (w = r, x = 0)), b.min = C(L, p, b.dataMin), b.max = C(B, w, b.dataMax));
					q && (b.positiveValuesOnly && !k && 0 >= Math.min(b.min, C(b.dataMin, b.min)) && a.error(10, 1), b.min = l(h(b.min), 15), b.max = l(h(b.max), 15));
					b.range && n(b.max) && (b.userMin = b.min = L = Math.max(b.dataMin, b.minFromRange()), b.userMax = B = b.max, b.range = null);
					m(b, "foundExtremes");
					b.beforePadding && b.beforePadding();
					b.adjustForMinRange();
					!(F || b.axisPointRange || b.usePercentage || t) && n(b.min) && n(b.max) && (h = b.max - b.min) && (!n(L) && g && (b.min -= h * g), !n(B) && x && (b.max += h * x));
					H(c.softMin) && (b.min = Math.min(b.min, c.softMin));
					H(c.softMax) && (b.max = Math.max(b.max, c.softMax));
					H(c.floor) && (b.min = Math.max(b.min, c.floor));
					H(c.ceiling) && (b.max = Math.min(b.max, c.ceiling));
					J && n(b.dataMin) && (r = r || 0, !n(L) && b.min < r && b.dataMin >= r ? b.min = r : !n(B) && b.max > r && b.dataMax <= r && (b.max = r));
					b.tickInterval = b.min === b.max || void 0 === b.min || void 0 === b.max ? 1 : t && !E && v === b.linkedParent.options.tickPixelInterval ? E = b.linkedParent.tickInterval : C(E, this.tickAmount ? (b.max - b.min) / Math.max(this.tickAmount - 1, 1) : void 0, F ? 1 : (b.max - b.min) * v / Math.max(b.len, v));
					A && !k && e(b.series, function(a) {
						a.processData(b.min !== b.oldMin || b.max !== b.oldMax)
					});
					b.setAxisTranslation(!0);
					b.beforeSetTickPositions && b.beforeSetTickPositions();
					b.postProcessTickInterval && (b.tickInterval = b.postProcessTickInterval(b.tickInterval));
					b.pointRange && !E && (b.tickInterval = Math.max(b.pointRange, b.tickInterval));
					k = C(c.minTickInterval, b.isDatetimeAxis && b.closestPointRange);
					!E && b.tickInterval < k && (b.tickInterval = k);
					y || q || E || (b.tickInterval = K(b.tickInterval, null, f(b.tickInterval), C(c.allowDecimals, !(.5 < b.tickInterval && 5 > b.tickInterval && 1E3 < b.max && 9999 > b.max)), !! this.tickAmount));
					this.tickAmount || (b.tickInterval = b.unsquish());
					this.setTickPositions()
				},
				setTickPositions: function() {
					var a = this.options,
						b, d = a.tickPositions;
					b = this.getMinorTickInterval();
					var c = a.tickPositioner,
						f = a.startOnTick,
						q = a.endOnTick;
					this.tickmarkOffset = this.categories && "between" === a.tickmarkPlacement && 1 === this.tickInterval ? .5 : 0;
					this.minorTickInterval = "auto" === b && this.tickInterval ? this.tickInterval / 5 : b;
					this.single = this.min === this.max && n(this.min) && !this.tickAmount && (parseInt(this.min, 10) === this.min || !1 !== a.allowDecimals);
					this.tickPositions = b = d && d.slice();
					!b && (b = this.isDatetimeAxis ? this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval, a.units), this.min, this.max, a.startOfWeek, this.ordinalPositions, this.closestPointRange, !0) : this.isLog ? this.getLogTickPositions(this.tickInterval, this.min, this.max) : this.getLinearTickPositions(this.tickInterval, this.min, this.max), b.length > this.len && (b = [b[0], b.pop()], b[0] === b[1] && (b.length = 1)), this.tickPositions = b, c && (c = c.apply(this, [this.min, this.max]))) && (this.tickPositions = b = c);
					this.paddedTicks = b.slice(0);
					this.trimTicks(b, f, q);
					this.isLinked || (this.single && 2 > b.length && (this.min -= .5, this.max += .5), d || c || this.adjustTickAmount())
				},
				trimTicks: function(a, b, d) {
					var k = a[0],
						c = a[a.length - 1],
						f = this.minPointOffset || 0;
					if (!this.isLinked) {
						if (b && -Infinity !== k) this.min = k;
						else for (; this.min - f > a[0];) a.shift();
						if (d) this.max = c;
						else for (; this.max + f < a[a.length - 1];) a.pop();
						0 === a.length && n(k) && a.push((c + k) / 2)
					}
				},
				alignToOthers: function() {
					var a = {},
						b, d = this.options;
					!1 === this.chart.options.chart.alignTicks || !1 === d.alignTicks || this.isLog || e(this.chart[this.coll], function(k) {
						var d = k.options,
							d = [k.horiz ? d.left : d.top, d.width, d.height, d.pane].join();
						k.series.length && (a[d] ? b = !0 : a[d] = 1)
					});
					return b
				},
				getTickAmount: function() {
					var a = this.options,
						b = a.tickAmount,
						d = a.tickPixelInterval;
					!n(a.tickInterval) && this.len < d && !this.isRadial && !this.isLog && a.startOnTick && a.endOnTick && (b = 2);
					!b && this.alignToOthers() && (b = Math.ceil(this.len / d) + 1);
					4 > b && (this.finalTickAmt = b, b = 5);
					this.tickAmount = b
				},
				adjustTickAmount: function() {
					var a = this.tickInterval,
						b = this.tickPositions,
						d = this.tickAmount,
						c = this.finalTickAmt,
						f = b && b.length;
					if (f < d) {
						for (; b.length < d;) b.push(l(b[b.length - 1] + a));
						this.transA *= (f - 1) / (d - 1);
						this.max = b[b.length - 1]
					} else f > d && (this.tickInterval *= 2, this.setTickPositions());
					if (n(c)) {
						for (a = d = b.length; a--;)(3 === c && 1 === a % 2 || 2 >= c && 0 < a && a < d - 1) && b.splice(a, 1);
						this.finalTickAmt = void 0
					}
				},
				setScale: function() {
					var a, b;
					this.oldMin = this.min;
					this.oldMax = this.max;
					this.oldAxisLength = this.len;
					this.setAxisSize();
					b = this.len !== this.oldAxisLength;
					e(this.series, function(b) {
						if (b.isDirtyData || b.isDirty || b.xAxis.isDirty) a = !0
					});
					b || a || this.isLinked || this.forceRedraw || this.userMin !== this.oldUserMin || this.userMax !== this.oldUserMax || this.alignToOthers() ? (this.resetStacks && this.resetStacks(), this.forceRedraw = !1, this.getSeriesExtremes(), this.setTickInterval(), this.oldUserMin = this.userMin, this.oldUserMax = this.userMax, this.isDirty || (this.isDirty = b || this.min !== this.oldMin || this.max !== this.oldMax)) : this.cleanStacks && this.cleanStacks()
				},
				setExtremes: function(a, b, d, c, f) {
					var k = this,
						q = k.chart;
					d = C(d, !0);
					e(k.series, function(a) {
						delete a.kdTree
					});
					f = h(f, {
						min: a,
						max: b
					});
					m(k, "setExtremes", f, function() {
						k.userMin = a;
						k.userMax = b;
						k.eventArgs = f;
						d && q.redraw(c)
					})
				},
				zoom: function(a, b) {
					var k = this.dataMin,
						d = this.dataMax,
						c = this.options,
						f = Math.min(k, C(c.min, k)),
						c = Math.max(d, C(c.max, d));
					if (a !== this.min || b !== this.max) this.allowZoomOutside || (n(k) && (a < f && (a = f), a > c && (a = c)), n(d) && (b < f && (b = f), b > c && (b = c))), this.displayBtn = void 0 !== a || void 0 !== b, this.setExtremes(a, b, !1, void 0, {
						trigger: "zoom"
					});
					return !0
				},
				setAxisSize: function() {
					var b = this.chart,
						d = this.options,
						c = d.offsets || [0, 0, 0, 0],
						f = this.horiz,
						q = this.width = Math.round(a.relativeLength(C(d.width, b.plotWidth - c[3] + c[1]), b.plotWidth)),
						e = this.height = Math.round(a.relativeLength(C(d.height, b.plotHeight - c[0] + c[2]), b.plotHeight)),
						h = this.top = Math.round(a.relativeLength(C(d.top, b.plotTop + c[0]), b.plotHeight, b.plotTop)),
						d = this.left = Math.round(a.relativeLength(C(d.left, b.plotLeft + c[3]), b.plotWidth, b.plotLeft));
					this.bottom = b.chartHeight - e - h;
					this.right = b.chartWidth - q - d;
					this.len = Math.max(f ? q : e, 0);
					this.pos = f ? d : h
				},
				getExtremes: function() {
					var a = this.isLog,
						b = this.lin2log;
					return {
						min: a ? l(b(this.min)) : this.min,
						max: a ? l(b(this.max)) : this.max,
						dataMin: this.dataMin,
						dataMax: this.dataMax,
						userMin: this.userMin,
						userMax: this.userMax
					}
				},
				getThreshold: function(a) {
					var b = this.isLog,
						k = this.lin2log,
						d = b ? k(this.min) : this.min,
						b = b ? k(this.max) : this.max;
					null === a ? a = d : d > a ? a = d : b < a && (a = b);
					return this.translate(a, 0, 1, 0, 1)
				},
				autoLabelAlign: function(a) {
					a = (C(a, 0) - 90 * this.side + 720) % 360;
					return 15 < a && 165 > a ? "right" : 195 < a && 345 > a ? "left" : "center"
				},
				tickSize: function(a) {
					var b = this.options,
						k = b[a + "Length"],
						d = C(b[a + "Width"], "tick" === a && this.isXAxis ? 1 : 0);
					if (d && k) return "inside" === b[a + "Position"] && (k = -k), [k, d]
				},
				labelMetrics: function() {
					var a = this.tickPositions && this.tickPositions[0] || 0;
					return this.chart.renderer.fontMetrics(this.options.labels.style && this.options.labels.style.fontSize, this.ticks[a] && this.ticks[a].label)
				},
				unsquish: function() {
					var a = this.options.labels,
						b = this.horiz,
						d = this.tickInterval,
						c = d,
						f = this.len / (((this.categories ? 1 : 0) + this.max - this.min) / d),
						q, h = a.rotation,
						m = this.labelMetrics(),
						y, A = Number.MAX_VALUE,
						t, x = function(a) {
							a /= f || 1;
							a = 1 < a ? Math.ceil(a) : 1;
							return a * d
						};
					b ? (t = !a.staggerLines && !a.step && (n(h) ? [h] : f < C(a.autoRotationLimit, 80) && a.autoRotation)) && e(t, function(a) {
						var b;
						if (a === h || a && -90 <= a && 90 >= a) y = x(Math.abs(m.h / Math.sin(w * a))), b = y + Math.abs(a / 360), b < A && (A = b, q = a, c = y)
					}) : a.step || (c = x(m.h));
					this.autoRotation = t;
					this.labelRotation = C(q, h);
					return c
				},
				getSlotWidth: function() {
					var a = this.chart,
						b = this.horiz,
						d = this.options.labels,
						c = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1),
						f = a.margin[3];
					return b && 2 > (d.step || 0) && !d.rotation && (this.staggerLines || 1) * this.len / c || !b && (d.style && parseInt(d.style.width, 10) || f && f - a.spacing[3] || .33 * a.chartWidth)
				},
				renderUnsquish: function() {
					var a = this.chart,
						b = a.renderer,
						d = this.tickPositions,
						c = this.ticks,
						f = this.options.labels,
						q = this.horiz,
						h = this.getSlotWidth(),
						m = Math.max(1, Math.round(h - 2 * (f.padding || 5))),
						y = {},
						A = this.labelMetrics(),
						x = f.style && f.style.textOverflow,
						g, E = 0,
						l, n;
					J(f.rotation) || (y.rotation = f.rotation || 0);
					e(d, function(a) {
						(a = c[a]) && a.labelLength > E && (E = a.labelLength)
					});
					this.maxLabelLength = E;
					if (this.autoRotation) E > m && E > A.h ? y.rotation = this.labelRotation : this.labelRotation = 0;
					else if (h && (g = {
						width: m + "px"
					}, !x)) for (g.textOverflow = "clip", l = d.length; !q && l--;) if (n = d[l], m = c[n].label) m.styles && "ellipsis" === m.styles.textOverflow ? m.css({
						textOverflow: "clip"
					}) : c[n].labelLength > h && m.css({
						width: h + "px"
					}), m.getBBox().height > this.len / d.length - (A.h - A.f) && (m.specCss = {
						textOverflow: "ellipsis"
					});
					y.rotation && (g = {
						width: (E > .5 * a.chartHeight ? .33 * a.chartHeight : a.chartHeight) + "px"
					}, x || (g.textOverflow = "ellipsis"));
					if (this.labelAlign = f.align || this.autoLabelAlign(this.labelRotation)) y.align = this.labelAlign;
					e(d, function(a) {
						var b = (a = c[a]) && a.label;
						b && (b.attr(y), g && b.css(t(g, b.specCss)), delete b.specCss, a.rotation = y.rotation)
					});
					this.tickRotCorr = b.rotCorr(A.b, this.labelRotation || 0, 0 !== this.side)
				},
				hasData: function() {
					return this.hasVisibleSeries || n(this.min) && n(this.max) && this.tickPositions && 0 < this.tickPositions.length
				},
				addTitle: function(a) {
					var b = this.chart.renderer,
						k = this.horiz,
						d = this.opposite,
						c = this.options.title,
						f;
					this.axisTitle || ((f = c.textAlign) || (f = (k ? {
						low: "left",
						middle: "center",
						high: "right"
					} : {
						low: d ? "right" : "left",
						middle: "center",
						high: d ? "left" : "right"
					})[c.align]), this.axisTitle = b.text(c.text, 0, 0, c.useHTML).attr({
						zIndex: 7,
						rotation: c.rotation || 0,
						align: f
					}).addClass("highcharts-axis-title").css(c.style).add(this.axisGroup), this.axisTitle.isNew = !0);
					c.style.width || this.isRadial || this.axisTitle.css({
						width: this.len
					});
					this.axisTitle[a ? "show" : "hide"](!0)
				},
				generateTick: function(a) {
					var b = this.ticks;
					b[a] ? b[a].addLabel() : b[a] = new E(this, a)
				},
				getOffset: function() {
					var a = this,
						b = a.chart,
						d = b.renderer,
						c = a.options,
						f = a.tickPositions,
						q = a.ticks,
						h = a.horiz,
						m = a.side,
						y = b.inverted && !a.isZAxis ? [1, 0, 3, 2][m] : m,
						A, t, g = 0,
						E, l = 0,
						H = c.title,
						v = c.labels,
						F = 0,
						r = b.axisOffset,
						b = b.clipOffset,
						J = [-1, 1, 1, -1][m],
						p = c.className,
						w = a.axisParent,
						K = this.tickSize("tick");
					A = a.hasData();
					a.showAxis = t = A || C(c.showEmpty, !0);
					a.staggerLines = a.horiz && v.staggerLines;
					a.axisGroup || (a.gridGroup = d.g("grid").attr({
						zIndex: c.gridZIndex || 1
					}).addClass("highcharts-" + this.coll.toLowerCase() + "-grid " + (p || "")).add(w), a.axisGroup = d.g("axis").attr({
						zIndex: c.zIndex || 2
					}).addClass("highcharts-" + this.coll.toLowerCase() + " " + (p || "")).add(w), a.labelGroup = d.g("axis-labels").attr({
						zIndex: v.zIndex || 7
					}).addClass("highcharts-" + a.coll.toLowerCase() + "-labels " + (p || "")).add(w));
					A || a.isLinked ? (e(f, function(b, k) {
						a.generateTick(b, k)
					}), a.renderUnsquish(), !1 === v.reserveSpace || 0 !== m && 2 !== m && {
						1: "left",
						3: "right"
					}[m] !== a.labelAlign && "center" !== a.labelAlign || e(f, function(a) {
						F = Math.max(q[a].getLabelSize(), F)
					}), a.staggerLines && (F *= a.staggerLines, a.labelOffset = F * (a.opposite ? -1 : 1))) : x(q, function(a, b) {
						a.destroy();
						delete q[b]
					});
					H && H.text && !1 !== H.enabled && (a.addTitle(t), t && !1 !== H.reserveSpace && (a.titleOffset = g = a.axisTitle.getBBox()[h ? "height" : "width"], E = H.offset, l = n(E) ? 0 : C(H.margin, h ? 5 : 10)));
					a.renderLine();
					a.offset = J * C(c.offset, r[m]);
					a.tickRotCorr = a.tickRotCorr || {
						x: 0,
						y: 0
					};
					d = 0 === m ? -a.labelMetrics().h : 2 === m ? a.tickRotCorr.y : 0;
					l = Math.abs(F) + l;
					F && (l = l - d + J * (h ? C(v.y, a.tickRotCorr.y + 8 * J) : v.x));
					a.axisTitleMargin = C(E, l);
					r[m] = Math.max(r[m], a.axisTitleMargin + g + J * a.offset, l, A && f.length && K ? K[0] + J * a.offset : 0);
					c = c.offset ? 0 : 2 * Math.floor(a.axisLine.strokeWidth() / 2);
					b[y] = Math.max(b[y], c)
				},
				getLinePath: function(a) {
					var b = this.chart,
						k = this.opposite,
						d = this.offset,
						c = this.horiz,
						f = this.left + (k ? this.width : 0) + d,
						d = b.chartHeight - this.bottom - (k ? this.height : 0) + d;
					k && (a *= -1);
					return b.renderer.crispLine(["M", c ? this.left : f, c ? d : this.top, "L", c ? b.chartWidth - this.right : f, c ? d : b.chartHeight - this.bottom], a)
				},
				renderLine: function() {
					this.axisLine || (this.axisLine = this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup), this.axisLine.attr({
						stroke: this.options.lineColor,
						"stroke-width": this.options.lineWidth,
						zIndex: 7
					}))
				},
				getTitlePosition: function() {
					var a = this.horiz,
						b = this.left,
						d = this.top,
						c = this.len,
						f = this.options.title,
						q = a ? b : d,
						e = this.opposite,
						h = this.offset,
						m = f.x || 0,
						y = f.y || 0,
						A = this.axisTitle,
						t = this.chart.renderer.fontMetrics(f.style && f.style.fontSize, A),
						A = Math.max(A.getBBox(null, 0).height - t.h - 1, 0),
						c = {
							low: q + (a ? 0 : c),
							middle: q + c / 2,
							high: q + (a ? c : 0)
						}[f.align],
						b = (a ? d + this.height : b) + (a ? 1 : -1) * (e ? -1 : 1) * this.axisTitleMargin + [-A, A, t.f, -A][this.side];
					return {
						x: a ? c + m : b + (e ? this.width : 0) + h + m,
						y: a ? b + y - (e ? this.height : 0) + h : c + y
					}
				},
				renderMinorTick: function(a) {
					var b = this.chart.hasRendered && H(this.oldMin),
						d = this.minorTicks;
					d[a] || (d[a] = new E(this, a, "minor"));
					b && d[a].isNew && d[a].render(null, !0);
					d[a].render(null, !1, 1)
				},
				renderTick: function(a, b) {
					var d = this.isLinked,
						k = this.ticks,
						c = this.chart.hasRendered && H(this.oldMin);
					if (!d || a >= this.min && a <= this.max) k[a] || (k[a] = new E(this, a)), c && k[a].isNew && k[a].render(b, !0, .1), k[a].render(b)
				},
				render: function() {
					var b = this,
						d = b.chart,
						c = b.options,
						f = b.isLog,
						q = b.lin2log,
						h = b.isLinked,
						m = b.tickPositions,
						y = b.axisTitle,
						t = b.ticks,
						g = b.minorTicks,
						l = b.alternateBands,
						n = c.stackLabels,
						C = c.alternateGridColor,
						v = b.tickmarkOffset,
						F = b.axisLine,
						r = b.showAxis,
						J = B(d.renderer.globalAnimation),
						p, w;
					b.labelEdge.length = 0;
					b.overlap = !1;
					e([t, g, l], function(a) {
						x(a, function(a) {
							a.isActive = !1
						})
					});
					if (b.hasData() || h) b.minorTickInterval && !b.categories && e(b.getMinorTickPositions(), function(a) {
						b.renderMinorTick(a)
					}), m.length && (e(m, function(a, d) {
						b.renderTick(a, d)
					}), v && (0 === b.min || b.single) && (t[-1] || (t[-1] = new E(b, -1, null, !0)), t[-1].render(-1))), C && e(m, function(c, k) {
						w = void 0 !== m[k + 1] ? m[k + 1] + v : b.max - v;
						0 === k % 2 && c < b.max && w <= b.max + (d.polar ? -v : v) && (l[c] || (l[c] = new a.PlotLineOrBand(b)), p = c + v, l[c].options = {
							from: f ? q(p) : p,
							to: f ? q(w) : w,
							color: C
						}, l[c].render(), l[c].isActive = !0)
					}), b._addedPlotLB || (e((c.plotLines || []).concat(c.plotBands || []), function(a) {
						b.addPlotBandOrLine(a)
					}), b._addedPlotLB = !0);
					e([t, g, l], function(a) {
						var b, c = [],
							k = J.duration;
						x(a, function(a, b) {
							a.isActive || (a.render(b, !1, 0), a.isActive = !1, c.push(b))
						});
						A(function() {
							for (b = c.length; b--;) a[c[b]] && !a[c[b]].isActive && (a[c[b]].destroy(), delete a[c[b]])
						}, a !== l && d.hasRendered && k ? k : 0)
					});
					F && (F[F.isPlaced ? "animate" : "attr"]({
						d: this.getLinePath(F.strokeWidth())
					}), F.isPlaced = !0, F[r ? "show" : "hide"](!0));
					y && r && (c = b.getTitlePosition(), H(c.y) ? (y[y.isNew ? "attr" : "animate"](c), y.isNew = !1) : (y.attr("y", -9999), y.isNew = !0));
					n && n.enabled && b.renderStackTotals();
					b.isDirty = !1
				},
				redraw: function() {
					this.visible && (this.render(), e(this.plotLinesAndBands, function(a) {
						a.render()
					}));
					e(this.series, function(a) {
						a.isDirty = !0
					})
				},
				keepProps: "extKey hcEvents names series userMax userMin".split(" "),
				destroy: function(a) {
					var b = this,
						c = b.stacks,
						k = b.plotLinesAndBands,
						f;
					a || L(b);
					x(c, function(a, b) {
						v(a);
						c[b] = null
					});
					e([b.ticks, b.minorTicks, b.alternateBands], function(a) {
						v(a)
					});
					if (k) for (a = k.length; a--;) k[a].destroy();
					e("stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross".split(" "), function(a) {
						b[a] && (b[a] = b[a].destroy())
					});
					for (f in b.plotLinesAndBandsGroups) b.plotLinesAndBandsGroups[f] = b.plotLinesAndBandsGroups[f].destroy();
					x(b, function(a, c) {
						-1 === d(c, b.keepProps) && delete b[c]
					})
				},
				drawCrosshair: function(a, b) {
					var d, c = this.crosshair,
						k = C(c.snap, !0),
						f, q = this.cross;
					a || (a = this.cross && this.cross.e);
					this.crosshair && !1 !== (n(b) || !k) ? (k ? n(b) && (f = this.isXAxis ? b.plotX : this.len - b.plotY) : f = a && (this.horiz ? a.chartX - this.pos : this.len - a.chartY + this.pos), n(f) && (d = this.getPlotLinePath(b && (this.isXAxis ? b.x : C(b.stackY, b.y)), null, null, null, f) || null), n(d) ? (b = this.categories && !this.isRadial, q || (this.cross = q = this.chart.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-" + (b ? "category " : "thin ") + c.className).attr({
						zIndex: C(c.zIndex, 2)
					}).add(), q.attr({
						stroke: c.color || (b ? g("#ccd6eb").setOpacity(.25).get() : "#cccccc"),
						"stroke-width": C(c.width, 1)
					}).css({
						"pointer-events": "none"
					}), c.dashStyle && q.attr({
						dashstyle: c.dashStyle
					})), q.show().attr({
						d: d
					}), b && !c.width && q.attr({
						"stroke-width": this.transA
					}), this.cross.e = a) : this.hideCrosshair()) : this.hideCrosshair()
				},
				hideCrosshair: function() {
					this.cross && this.cross.hide()
				}
			});
			return a.Axis = F
		}(N);
	(function(a) {
		var D = a.Axis,
			B = a.Date,
			G = a.dateFormat,
			p = a.defaultOptions,
			g = a.defined,
			l = a.each,
			r = a.extend,
			n = a.getMagnitude,
			w = a.getTZOffset,
			v = a.normalizeTickInterval,
			e = a.pick,
			h = a.timeUnits;
		D.prototype.getTimeTicks = function(a, c, f, b) {
			var d = [],
				m = {},
				n = p.global.useUTC,
				v, t = new B(c - Math.max(w(c), w(f))),
				K = B.hcMakeTime,
				x = a.unitRange,
				C = a.count,
				L, q;
			if (g(c)) {
				t[B.hcSetMilliseconds](x >= h.second ? 0 : C * Math.floor(t.getMilliseconds() / C));
				if (x >= h.second) t[B.hcSetSeconds](x >= h.minute ? 0 : C * Math.floor(t.getSeconds() / C));
				if (x >= h.minute) t[B.hcSetMinutes](x >= h.hour ? 0 : C * Math.floor(t[B.hcGetMinutes]() / C));
				if (x >= h.hour) t[B.hcSetHours](x >= h.day ? 0 : C * Math.floor(t[B.hcGetHours]() / C));
				if (x >= h.day) t[B.hcSetDate](x >= h.month ? 1 : C * Math.floor(t[B.hcGetDate]() / C));
				x >= h.month && (t[B.hcSetMonth](x >= h.year ? 0 : C * Math.floor(t[B.hcGetMonth]() / C)), v = t[B.hcGetFullYear]());
				if (x >= h.year) t[B.hcSetFullYear](v - v % C);
				if (x === h.week) t[B.hcSetDate](t[B.hcGetDate]() - t[B.hcGetDay]() + e(b, 1));
				v = t[B.hcGetFullYear]();
				b = t[B.hcGetMonth]();
				var A = t[B.hcGetDate](),
					E = t[B.hcGetHours]();
				if (B.hcTimezoneOffset || B.hcGetTimezoneOffset) q = (!n || !! B.hcGetTimezoneOffset) && (f - c > 4 * h.month || w(c) !== w(f)), t = t.getTime(), L = w(t), t = new B(t + L);
				n = t.getTime();
				for (c = 1; n < f;) d.push(n), n = x === h.year ? K(v + c * C, 0) : x === h.month ? K(v, b + c * C) : !q || x !== h.day && x !== h.week ? q && x === h.hour ? K(v, b, A, E + c * C, 0, 0, L) - L : n + x * C : K(v, b, A + c * C * (x === h.day ? 1 : 7)), c++;
				d.push(n);
				x <= h.hour && 1E4 > d.length && l(d, function(a) {
					0 === a % 18E5 && "000000000" === G("%H%M%S%L", a) && (m[a] = "day")
				})
			}
			d.info = r(a, {
				higherRanks: m,
				totalRange: x * C
			});
			return d
		};
		D.prototype.normalizeTimeTickInterval = function(a, c) {
			var f = c || [
				["millisecond", [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]],
				["second", [1, 2, 5, 10, 15, 30]],
				["minute", [1, 2, 5, 10, 15, 30]],
				["hour", [1, 2, 3, 4, 6, 8, 12]],
				["day", [1, 2]],
				["week", [1, 2]],
				["month", [1, 2, 3, 4, 6]],
				["year", null]
			];
			c = f[f.length - 1];
			var b = h[c[0]],
				d = c[1],
				e;
			for (e = 0; e < f.length && !(c = f[e], b = h[c[0]], d = c[1], f[e + 1] && a <= (b * d[d.length - 1] + h[f[e + 1][0]]) / 2); e++);
			b === h.year && a < 5 * b && (d = [1, 2, 5]);
			a = v(a / b, d, "year" === c[0] ? Math.max(n(a / b), 1) : 1);
			return {
				unitRange: b,
				count: a,
				unitName: c[0]
			}
		}
	})(N);
	(function(a) {
		var D = a.Axis,
			B = a.getMagnitude,
			G = a.map,
			p = a.normalizeTickInterval,
			g = a.pick;
		D.prototype.getLogTickPositions = function(a, r, n, w) {
			var l = this.options,
				e = this.len,
				h = this.lin2log,
				m = this.log2lin,
				c = [];
			w || (this._minorAutoInterval = null);
			if (.5 <= a) a = Math.round(a), c = this.getLinearTickPositions(a, r, n);
			else if (.08 <= a) for (var e = Math.floor(r), f, b, d, y, H, l = .3 < a ? [1, 2, 4] : .15 < a ? [1, 2, 4, 6, 8] : [1, 2, 3, 4, 5, 6, 7, 8, 9]; e < n + 1 && !H; e++) for (b = l.length, f = 0; f < b && !H; f++) d = m(h(e) * l[f]), d > r && (!w || y <= n) && void 0 !== y && c.push(y), y > n && (H = !0), y = d;
			else r = h(r), n = h(n), a = w ? this.getMinorTickInterval() : l.tickInterval, a = g("auto" === a ? null : a, this._minorAutoInterval, l.tickPixelInterval / (w ? 5 : 1) * (n - r) / ((w ? e / this.tickPositions.length : e) || 1)), a = p(a, null, B(a)), c = G(this.getLinearTickPositions(a, r, n), m), w || (this._minorAutoInterval = a / 5);
			w || (this.tickInterval = a);
			return c
		};
		D.prototype.log2lin = function(a) {
			return Math.log(a) / Math.LN10
		};
		D.prototype.lin2log = function(a) {
			return Math.pow(10, a)
		}
	})(N);
	(function(a, D) {
		var B = a.arrayMax,
			G = a.arrayMin,
			p = a.defined,
			g = a.destroyObjectProperties,
			l = a.each,
			r = a.erase,
			n = a.merge,
			w = a.pick;
		a.PlotLineOrBand = function(a, e) {
			this.axis = a;
			e && (this.options = e, this.id = e.id)
		};
		a.PlotLineOrBand.prototype = {
			render: function() {
				var g = this,
					e = g.axis,
					h = e.horiz,
					m = g.options,
					c = m.label,
					f = g.label,
					b = m.to,
					d = m.from,
					y = m.value,
					l = p(d) && p(b),
					r = p(y),
					t = g.svgElem,
					K = !t,
					x = [],
					C = m.color,
					L = w(m.zIndex, 0),
					q = m.events,
					x = {
						"class": "highcharts-plot-" + (l ? "band " : "line ") + (m.className || "")
					},
					A = {},
					E = e.chart.renderer,
					F = l ? "bands" : "lines",
					k = e.log2lin;
				e.isLog && (d = k(d), b = k(b), y = k(y));
				r ? (x = {
					stroke: C,
					"stroke-width": m.width
				}, m.dashStyle && (x.dashstyle = m.dashStyle)) : l && (C && (x.fill = C), m.borderWidth && (x.stroke = m.borderColor, x["stroke-width"] = m.borderWidth));
				A.zIndex = L;
				F += "-" + L;
				(C = e.plotLinesAndBandsGroups[F]) || (e.plotLinesAndBandsGroups[F] = C = E.g("plot-" + F).attr(A).add());
				K && (g.svgElem = t = E.path().attr(x).add(C));
				if (r) x = e.getPlotLinePath(y, t.strokeWidth());
				else if (l) x = e.getPlotBandPath(d, b, m);
				else return;
				K && x && x.length ? (t.attr({
					d: x
				}), q && a.objectEach(q, function(a, b) {
					t.on(b, function(a) {
						q[b].apply(g, [a])
					})
				})) : t && (x ? (t.show(), t.animate({
					d: x
				})) : (t.hide(), f && (g.label = f = f.destroy())));
				c && p(c.text) && x && x.length && 0 < e.width && 0 < e.height && !x.flat ? (c = n({
					align: h && l && "center",
					x: h ? !l && 4 : 10,
					verticalAlign: !h && l && "middle",
					y: h ? l ? 16 : 10 : l ? 6 : -4,
					rotation: h && !l && 90
				}, c), this.renderLabel(c, x, l, L)) : f && f.hide();
				return g
			},
			renderLabel: function(a, e, h, m) {
				var c = this.label,
					f = this.axis.chart.renderer;
				c || (c = {
					align: a.textAlign || a.align,
					rotation: a.rotation,
					"class": "highcharts-plot-" + (h ? "band" : "line") + "-label " + (a.className || "")
				}, c.zIndex = m, this.label = c = f.text(a.text, 0, 0, a.useHTML).attr(c).add(), c.css(a.style));
				m = e.xBounds || [e[1], e[4], h ? e[6] : e[1]];
				e = e.yBounds || [e[2], e[5], h ? e[7] : e[2]];
				h = G(m);
				f = G(e);
				c.align(a, !1, {
					x: h,
					y: f,
					width: B(m) - h,
					height: B(e) - f
				});
				c.show()
			},
			destroy: function() {
				r(this.axis.plotLinesAndBands, this);
				delete this.axis;
				g(this)
			}
		};
		a.extend(D.prototype, {
			getPlotBandPath: function(a, e) {
				var h = this.getPlotLinePath(e, null, null, !0),
					m = this.getPlotLinePath(a, null, null, !0),
					c = [],
					f = this.horiz,
					b = 1,
					d;
				a = a < this.min && e < this.min || a > this.max && e > this.max;
				if (m && h) for (a && (d = m.toString() === h.toString(), b = 0), a = 0; a < m.length; a += 6) f && h[a + 1] === m[a + 1] ? (h[a + 1] += b, h[a + 4] += b) : f || h[a + 2] !== m[a + 2] || (h[a + 2] += b, h[a + 5] += b), c.push("M", m[a + 1], m[a + 2], "L", m[a + 4], m[a + 5], h[a + 4], h[a + 5], h[a + 1], h[a + 2], "z"), c.flat = d;
				return c
			},
			addPlotBand: function(a) {
				return this.addPlotBandOrLine(a, "plotBands")
			},
			addPlotLine: function(a) {
				return this.addPlotBandOrLine(a, "plotLines")
			},
			addPlotBandOrLine: function(g, e) {
				var h = (new a.PlotLineOrBand(this, g)).render(),
					m = this.userOptions;
				h && (e && (m[e] = m[e] || [], m[e].push(g)), this.plotLinesAndBands.push(h));
				return h
			},
			removePlotBandOrLine: function(a) {
				for (var e = this.plotLinesAndBands, h = this.options, m = this.userOptions, c = e.length; c--;) e[c].id === a && e[c].destroy();
				l([h.plotLines || [], m.plotLines || [], h.plotBands || [], m.plotBands || []], function(f) {
					for (c = f.length; c--;) f[c].id === a && r(f, f[c])
				})
			},
			removePlotBand: function(a) {
				this.removePlotBandOrLine(a)
			},
			removePlotLine: function(a) {
				this.removePlotBandOrLine(a)
			}
		})
	})(N, V);
	(function(a) {
		var D = a.dateFormat,
			B = a.each,
			G = a.extend,
			p = a.format,
			g = a.isNumber,
			l = a.map,
			r = a.merge,
			n = a.pick,
			w = a.splat,
			v = a.syncTimeout,
			e = a.timeUnits;
		a.Tooltip = function() {
			this.init.apply(this, arguments)
		};
		a.Tooltip.prototype = {
			init: function(a, e) {
				this.chart = a;
				this.options = e;
				this.crosshairs = [];
				this.now = {
					x: 0,
					y: 0
				};
				this.isHidden = !0;
				this.split = e.split && !a.inverted;
				this.shared = e.shared || this.split
			},
			cleanSplit: function(a) {
				B(this.chart.series, function(e) {
					var c = e && e.tt;
					c && (!c.isActive || a ? e.tt = c.destroy() : c.isActive = !1)
				})
			},
			getLabel: function() {
				var a = this.chart.renderer,
					e = this.options;
				this.label || (this.split ? this.label = a.g("tooltip") : (this.label = a.label("", 0, 0, e.shape || "callout", null, null, e.useHTML, null, "tooltip").attr({
					padding: e.padding,
					r: e.borderRadius
				}), this.label.attr({
					fill: e.backgroundColor,
					"stroke-width": e.borderWidth
				}).css(e.style).shadow(e.shadow)), this.label.attr({
					zIndex: 8
				}).add());
				return this.label
			},
			update: function(a) {
				this.destroy();
				r(!0, this.chart.options.tooltip.userOptions, a);
				this.init(this.chart, r(!0, this.options, a))
			},
			destroy: function() {
				this.label && (this.label = this.label.destroy());
				this.split && this.tt && (this.cleanSplit(this.chart, !0), this.tt = this.tt.destroy());
				clearTimeout(this.hideTimer);
				clearTimeout(this.tooltipTimeout)
			},
			move: function(a, e, c, f) {
				var b = this,
					d = b.now,
					h = !1 !== b.options.animation && !b.isHidden && (1 < Math.abs(a - d.x) || 1 < Math.abs(e - d.y)),
					m = b.followPointer || 1 < b.len;
				G(d, {
					x: h ? (2 * d.x + a) / 3 : a,
					y: h ? (d.y + e) / 2 : e,
					anchorX: m ? void 0 : h ? (2 * d.anchorX + c) / 3 : c,
					anchorY: m ? void 0 : h ? (d.anchorY + f) / 2 : f
				});
				b.getLabel().attr(d);
				h && (clearTimeout(this.tooltipTimeout), this.tooltipTimeout = setTimeout(function() {
					b && b.move(a, e, c, f)
				}, 32))
			},
			hide: function(a) {
				var e = this;
				clearTimeout(this.hideTimer);
				a = n(a, this.options.hideDelay, 500);
				this.isHidden || (this.hideTimer = v(function() {
					e.getLabel()[a ? "fadeOut" : "hide"]();
					e.isHidden = !0
				}, a))
			},
			getAnchor: function(a, e) {
				var c, f = this.chart,
					b = f.inverted,
					d = f.plotTop,
					h = f.plotLeft,
					m = 0,
					g = 0,
					t, n;
				a = w(a);
				c = a[0].tooltipPos;
				this.followPointer && e && (void 0 === e.chartX && (e = f.pointer.normalize(e)), c = [e.chartX - f.plotLeft, e.chartY - d]);
				c || (B(a, function(a) {
					t = a.series.yAxis;
					n = a.series.xAxis;
					m += a.plotX + (!b && n ? n.left - h : 0);
					g += (a.plotLow ? (a.plotLow + a.plotHigh) / 2 : a.plotY) + (!b && t ? t.top - d : 0)
				}), m /= a.length, g /= a.length, c = [b ? f.plotWidth - g : m, this.shared && !b && 1 < a.length && e ? e.chartY - d : b ? f.plotHeight - m : g]);
				return l(c, Math.round)
			},
			getPosition: function(a, e, c) {
				var f = this.chart,
					b = this.distance,
					d = {},
					h = f.inverted && c.h || 0,
					m, g = ["y", f.chartHeight, e, c.plotY + f.plotTop, f.plotTop, f.plotTop + f.plotHeight],
					t = ["x", f.chartWidth, a, c.plotX + f.plotLeft, f.plotLeft, f.plotLeft + f.plotWidth],
					l = !this.followPointer && n(c.ttBelow, !f.inverted === !! c.negative),
					x = function(a, c, f, k, e, q) {
						var m = f < k - b,
							y = k + b + f < c,
							u = k - b - f;
						k += b;
						if (l && y) d[a] = k;
						else if (!l && m) d[a] = u;
						else if (m) d[a] = Math.min(q - f, 0 > u - h ? u : u - h);
						else if (y) d[a] = Math.max(e, k + h + f > c ? k : k + h);
						else return !1
					},
					C = function(a, c, f, k) {
						var e;
						k < b || k > c - b ? e = !1 : d[a] = k < f / 2 ? 1 : k > c - f / 2 ? c - f - 2 : k - f / 2;
						return e
					},
					r = function(a) {
						var b = g;
						g = t;
						t = b;
						m = a
					},
					q = function() {
						!1 !== x.apply(0, g) ? !1 !== C.apply(0, t) || m || (r(!0), q()) : m ? d.x = d.y = 0 : (r(!0), q())
					};
				(f.inverted || 1 < this.len) && r();
				q();
				return d
			},
			defaultFormatter: function(a) {
				var e = this.points || w(this),
					c;
				c = [a.tooltipFooterHeaderFormatter(e[0])];
				c = c.concat(a.bodyFormatter(e));
				c.push(a.tooltipFooterHeaderFormatter(e[0], !0));
				return c
			},
			refresh: function(a, e) {
				var c, f = this.options,
					b, d = a,
					h, m = {},
					g = [];
				c = f.formatter || this.defaultFormatter;
				var m = this.shared,
					t;
				f.enabled && (clearTimeout(this.hideTimer), this.followPointer = w(d)[0].series.tooltipOptions.followPointer, h = this.getAnchor(d, e), e = h[0], b = h[1], !m || d.series && d.series.noSharedTooltip ? m = d.getLabelConfig() : (B(d, function(a) {
					a.setState("hover");
					g.push(a.getLabelConfig())
				}), m = {
					x: d[0].category,
					y: d[0].y
				}, m.points = g, d = d[0]), this.len = g.length, m = c.call(m, this), t = d.series, this.distance = n(t.tooltipOptions.distance, 16), !1 === m ? this.hide() : (c = this.getLabel(), this.isHidden && c.attr({
					opacity: 1
				}).show(), this.split ? this.renderSplit(m, w(a)) : (f.style.width || c.css({
					width: this.chart.spacingBox.width
				}), c.attr({
					text: m && m.join ? m.join("") : m
				}), c.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-" + n(d.colorIndex, t.colorIndex)), c.attr({
					stroke: f.borderColor || d.color || t.color || "#666666"
				}), this.updatePosition({
					plotX: e,
					plotY: b,
					negative: d.negative,
					ttBelow: d.ttBelow,
					h: h[2] || 0
				})), this.isHidden = !1))
			},
			renderSplit: function(e, m) {
				var c = this,
					f = [],
					b = this.chart,
					d = b.renderer,
					h = !0,
					g = this.options,
					l = 0,
					t = this.getLabel();
				a.isString(e) && (e = [!1, e]);
				B(e.slice(0, m.length + 1), function(a, e) {
					if (!1 !== a) {
						e = m[e - 1] || {
							isHeader: !0,
							plotX: m[0].plotX
						};
						var y = e.series || c,
							x = y.tt,
							q = e.series || {},
							A = "highcharts-color-" + n(e.colorIndex, q.colorIndex, "none");
						x || (y.tt = x = d.label(null, null, null, "callout", null, null, g.useHTML).addClass("highcharts-tooltip-box " + A).attr({
							padding: g.padding,
							r: g.borderRadius,
							fill: g.backgroundColor,
							stroke: g.borderColor || e.color || q.color || "#333333",
							"stroke-width": g.borderWidth
						}).add(t));
						x.isActive = !0;
						x.attr({
							text: a
						});
						x.css(g.style).shadow(g.shadow);
						a = x.getBBox();
						q = a.width + x.strokeWidth();
						e.isHeader ? (l = a.height, q = Math.max(0, Math.min(e.plotX + b.plotLeft - q / 2, b.chartWidth - q))) : q = e.plotX + b.plotLeft - n(g.distance, 16) - q;
						0 > q && (h = !1);
						a = (e.series && e.series.yAxis && e.series.yAxis.pos) + (e.plotY || 0);
						a -= b.plotTop;
						f.push({
							target: e.isHeader ? b.plotHeight + l : a,
							rank: e.isHeader ? 1 : 0,
							size: y.tt.getBBox().height + 1,
							point: e,
							x: q,
							tt: x
						})
					}
				});
				this.cleanSplit();
				a.distribute(f, b.plotHeight + l);
				B(f, function(a) {
					var d = a.point,
						c = d.series;
					a.tt.attr({
						visibility: void 0 === a.pos ? "hidden" : "inherit",
						x: h || d.isHeader ? a.x : d.plotX + b.plotLeft + n(g.distance, 16),
						y: a.pos + b.plotTop,
						anchorX: d.isHeader ? d.plotX + b.plotLeft : d.plotX + c.xAxis.pos,
						anchorY: d.isHeader ? a.pos + b.plotTop - 15 : d.plotY + c.yAxis.pos
					})
				})
			},
			updatePosition: function(a) {
				var e = this.chart,
					c = this.getLabel(),
					c = (this.options.positioner || this.getPosition).call(this, c.width, c.height, a);
				this.move(Math.round(c.x), Math.round(c.y || 0), a.plotX + e.plotLeft, a.plotY + e.plotTop)
			},
			getDateFormat: function(a, m, c, f) {
				var b = D("%m-%d %H:%M:%S.%L", m),
					d, h, g = {
						millisecond: 15,
						second: 12,
						minute: 9,
						hour: 6,
						day: 3
					},
					l = "millisecond";
				for (h in e) {
					if (a === e.week && +D("%w", m) === c && "00:00:00.000" === b.substr(6)) {
						h = "week";
						break
					}
					if (e[h] > a) {
						h = l;
						break
					}
					if (g[h] && b.substr(g[h]) !== "01-01 00:00:00.000".substr(g[h])) break;
					"week" !== h && (l = h)
				}
				h && (d = f[h]);
				return d
			},
			getXDateFormat: function(a, e, c) {
				e = e.dateTimeLabelFormats;
				var f = c && c.closestPointRange;
				return (f ? this.getDateFormat(f, a.x, c.options.startOfWeek, e) : e.day) || e.year
			},
			tooltipFooterHeaderFormatter: function(a, e) {
				e = e ? "footer" : "header";
				var c = a.series,
					f = c.tooltipOptions,
					b = f.xDateFormat,
					d = c.xAxis,
					h = d && "datetime" === d.options.type && g(a.key),
					m = f[e + "Format"];
				h && !b && (b = this.getXDateFormat(a, f, d));
				h && b && B(a.point && a.point.tooltipDateKeys || ["key"], function(a) {
					m = m.replace("{point." + a + "}", "{point." + a + ":" + b + "}")
				});
				return p(m, {
					point: a,
					series: c
				})
			},
			bodyFormatter: function(a) {
				return l(a, function(a) {
					var c = a.series.tooltipOptions;
					return (c[(a.point.formatPrefix || "point") + "Formatter"] || a.point.tooltipFormatter).call(a.point, c[(a.point.formatPrefix || "point") + "Format"])
				})
			}
		}
	})(N);
	(function(a) {
		var D = a.addEvent,
			B = a.attr,
			G = a.charts,
			p = a.color,
			g = a.css,
			l = a.defined,
			r = a.each,
			n = a.extend,
			w = a.find,
			v = a.fireEvent,
			e = a.isObject,
			h = a.offset,
			m = a.pick,
			c = a.splat,
			f = a.Tooltip;
		a.Pointer = function(a, d) {
			this.init(a, d)
		};
		a.Pointer.prototype = {
			init: function(a, d) {
				this.options = d;
				this.chart = a;
				this.runChartClick = d.chart.events && !! d.chart.events.click;
				this.pinchDown = [];
				this.lastValidTouch = {};
				f && (a.tooltip = new f(a, d.tooltip), this.followTouchMove = m(d.tooltip.followTouchMove, !0));
				this.setDOMEvents()
			},
			zoomOption: function(a) {
				var b = this.chart,
					c = b.options.chart,
					f = c.zoomType || "",
					b = b.inverted;
				/touch/.test(a.type) && (f = m(c.pinchType, f));
				this.zoomX = a = /x/.test(f);
				this.zoomY = f = /y/.test(f);
				this.zoomHor = a && !b || f && b;
				this.zoomVert = f && !b || a && b;
				this.hasZoom = a || f
			},
			normalize: function(a, d) {
				var b;
				b = a.touches ? a.touches.length ? a.touches.item(0) : a.changedTouches[0] : a;
				d || (this.chartPosition = d = h(this.chart.container));
				return n(a, {
					chartX: Math.round(b.pageX - d.left),
					chartY: Math.round(b.pageY - d.top)
				})
			},
			getCoordinates: function(a) {
				var b = {
					xAxis: [],
					yAxis: []
				};
				r(this.chart.axes, function(d) {
					b[d.isXAxis ? "xAxis" : "yAxis"].push({
						axis: d,
						value: d.toValue(a[d.horiz ? "chartX" : "chartY"])
					})
				});
				return b
			},
			findNearestKDPoint: function(a, d, c) {
				var b;
				r(a, function(a) {
					var f = !(a.noSharedTooltip && d) && 0 > a.options.findNearestPointBy.indexOf("y");
					a = a.searchPoint(c, f);
					if ((f = e(a, !0)) && !(f = !e(b, !0))) var f = b.distX - a.distX,
						h = b.dist - a.dist,
						m = (a.series.group && a.series.group.zIndex) - (b.series.group && b.series.group.zIndex),
						f = 0 < (0 !== f && d ? f : 0 !== h ? h : 0 !== m ? m : b.series.index > a.series.index ? -1 : 1);
					f && (b = a)
				});
				return b
			},
			getPointFromEvent: function(a) {
				a = a.target;
				for (var b; a && !b;) b = a.point, a = a.parentNode;
				return b
			},
			getChartCoordinatesFromPoint: function(a, d) {
				var b = a.series,
					c = b.xAxis,
					b = b.yAxis,
					f = m(a.clientX, a.plotX);
				if (c && b) return d ? {
					chartX: c.len + c.pos - f,
					chartY: b.len + b.pos - a.plotY
				} : {
					chartX: f + c.pos,
					chartY: a.plotY + b.pos
				}
			},
			getHoverData: function(b, c, f, h, g, t, l) {
				var d, y = [],
					n = l && l.isBoosting;
				h = !(!h || !b);
				l = c && !c.stickyTracking ? [c] : a.grep(f, function(a) {
					return a.visible && !(!g && a.directTouch) && m(a.options.enableMouseTracking, !0) && a.stickyTracking
				});
				c = (d = h ? b : this.findNearestKDPoint(l, g, t)) && d.series;
				d && (g && !c.noSharedTooltip ? (l = a.grep(f, function(a) {
					return a.visible && !(!g && a.directTouch) && m(a.options.enableMouseTracking, !0) && !a.noSharedTooltip
				}), r(l, function(a) {
					var b = w(a.points, function(a) {
						return a.x === d.x && !a.isNull
					});
					e(b) && (n && (b = a.getPoint(b)), y.push(b))
				})) : y.push(d));
				return {
					hoverPoint: d,
					hoverSeries: c,
					hoverPoints: y
				}
			},
			runPointActions: function(b, c) {
				var d = this.chart,
					f = d.tooltip && d.tooltip.options.enabled ? d.tooltip : void 0,
					e = f ? f.shared : !1,
					h = c || d.hoverPoint,
					g = h && h.series || d.hoverSeries,
					g = this.getHoverData(h, g, d.series, !! c || g && g.directTouch && this.isDirectTouch, e, b, {
						isBoosting: d.isBoosting
					}),
					l, h = g.hoverPoint;
				l = g.hoverPoints;
				c = (g = g.hoverSeries) && g.tooltipOptions.followPointer;
				e = e && g && !g.noSharedTooltip;
				if (h && (h !== d.hoverPoint || f && f.isHidden)) {
					r(d.hoverPoints || [], function(b) {
						-1 === a.inArray(b, l) && b.setState()
					});
					r(l || [], function(a) {
						a.setState("hover")
					});
					if (d.hoverSeries !== g) g.onMouseOver();
					d.hoverPoint && d.hoverPoint.firePointEvent("mouseOut");
					if (!h.series) return;
					h.firePointEvent("mouseOver");
					d.hoverPoints = l;
					d.hoverPoint = h;
					f && f.refresh(e ? l : h, b)
				} else c && f && !f.isHidden && (h = f.getAnchor([{}], b), f.updatePosition({
					plotX: h[0],
					plotY: h[1]
				}));
				this.unDocMouseMove || (this.unDocMouseMove = D(d.container.ownerDocument, "mousemove", function(b) {
					var c = G[a.hoverChartIndex];
					if (c) c.pointer.onDocumentMouseMove(b)
				}));
				r(d.axes, function(c) {
					var d = m(c.crosshair.snap, !0),
						f = d ? a.find(l, function(a) {
							return a.series[c.coll] === c
						}) : void 0;
					f || !d ? c.drawCrosshair(b, f) : c.hideCrosshair()
				})
			},
			reset: function(a, d) {
				var b = this.chart,
					f = b.hoverSeries,
					e = b.hoverPoint,
					h = b.hoverPoints,
					g = b.tooltip,
					m = g && g.shared ? h : e;
				a && m && r(c(m), function(b) {
					b.series.isCartesian && void 0 === b.plotX && (a = !1)
				});
				if (a) g && m && (g.refresh(m), e && (e.setState(e.state, !0), r(b.axes, function(a) {
					a.crosshair && a.drawCrosshair(null, e)
				})));
				else {
					if (e) e.onMouseOut();
					h && r(h, function(a) {
						a.setState()
					});
					if (f) f.onMouseOut();
					g && g.hide(d);
					this.unDocMouseMove && (this.unDocMouseMove = this.unDocMouseMove());
					r(b.axes, function(a) {
						a.hideCrosshair()
					});
					this.hoverX = b.hoverPoints = b.hoverPoint = null
				}
			},
			scaleGroups: function(a, c) {
				var b = this.chart,
					d;
				r(b.series, function(f) {
					d = a || f.getPlotBox();
					f.xAxis && f.xAxis.zoomEnabled && f.group && (f.group.attr(d), f.markerGroup && (f.markerGroup.attr(d), f.markerGroup.clip(c ? b.clipRect : null)), f.dataLabelsGroup && f.dataLabelsGroup.attr(d))
				});
				b.clipRect.attr(c || b.clipBox)
			},
			dragStart: function(a) {
				var b = this.chart;
				b.mouseIsDown = a.type;
				b.cancelClick = !1;
				b.mouseDownX = this.mouseDownX = a.chartX;
				b.mouseDownY = this.mouseDownY = a.chartY
			},
			drag: function(a) {
				var b = this.chart,
					c = b.options.chart,
					f = a.chartX,
					e = a.chartY,
					h = this.zoomHor,
					g = this.zoomVert,
					m = b.plotLeft,
					l = b.plotTop,
					n = b.plotWidth,
					q = b.plotHeight,
					A, E = this.selectionMarker,
					F = this.mouseDownX,
					k = this.mouseDownY,
					u = c.panKey && a[c.panKey + "Key"];
				E && E.touch || (f < m ? f = m : f > m + n && (f = m + n), e < l ? e = l : e > l + q && (e = l + q), this.hasDragged = Math.sqrt(Math.pow(F - f, 2) + Math.pow(k - e, 2)), 10 < this.hasDragged && (A = b.isInsidePlot(F - m, k - l), b.hasCartesianSeries && (this.zoomX || this.zoomY) && A && !u && !E && (this.selectionMarker = E = b.renderer.rect(m, l, h ? 1 : n, g ? 1 : q, 0).attr({
					fill: c.selectionMarkerFill || p("#335cad").setOpacity(.25).get(),
					"class": "highcharts-selection-marker",
					zIndex: 7
				}).add()), E && h && (f -= F, E.attr({
					width: Math.abs(f),
					x: (0 < f ? 0 : f) + F
				})), E && g && (f = e - k, E.attr({
					height: Math.abs(f),
					y: (0 < f ? 0 : f) + k
				})), A && !E && c.panning && b.pan(a, c.panning)))
			},
			drop: function(a) {
				var b = this,
					c = this.chart,
					f = this.hasPinched;
				if (this.selectionMarker) {
					var e = {
						originalEvent: a,
						xAxis: [],
						yAxis: []
					},
						h = this.selectionMarker,
						m = h.attr ? h.attr("x") : h.x,
						x = h.attr ? h.attr("y") : h.y,
						C = h.attr ? h.attr("width") : h.width,
						p = h.attr ? h.attr("height") : h.height,
						q;
					if (this.hasDragged || f) r(c.axes, function(c) {
						if (c.zoomEnabled && l(c.min) && (f || b[{
							xAxis: "zoomX",
							yAxis: "zoomY"
						}[c.coll]])) {
							var d = c.horiz,
								h = "touchend" === a.type ? c.minPixelPadding : 0,
								k = c.toValue((d ? m : x) + h),
								d = c.toValue((d ? m + C : x + p) - h);
							e[c.coll].push({
								axis: c,
								min: Math.min(k, d),
								max: Math.max(k, d)
							});
							q = !0
						}
					}), q && v(c, "selection", e, function(a) {
						c.zoom(n(a, f ? {
							animation: !1
						} : null))
					});
					this.selectionMarker = this.selectionMarker.destroy();
					f && this.scaleGroups()
				}
				c && (g(c.container, {
					cursor: c._cursor
				}), c.cancelClick = 10 < this.hasDragged, c.mouseIsDown = this.hasDragged = this.hasPinched = !1, this.pinchDown = [])
			},
			onContainerMouseDown: function(a) {
				a = this.normalize(a);
				this.zoomOption(a);
				a.preventDefault && a.preventDefault();
				this.dragStart(a)
			},
			onDocumentMouseUp: function(b) {
				G[a.hoverChartIndex] && G[a.hoverChartIndex].pointer.drop(b)
			},
			onDocumentMouseMove: function(a) {
				var b = this.chart,
					c = this.chartPosition;
				a = this.normalize(a, c);
				!c || this.inClass(a.target, "highcharts-tracker") || b.isInsidePlot(a.chartX - b.plotLeft, a.chartY - b.plotTop) || this.reset()
			},
			onContainerMouseLeave: function(b) {
				var c = G[a.hoverChartIndex];
				c && (b.relatedTarget || b.toElement) && (c.pointer.reset(), c.pointer.chartPosition = null)
			},
			onContainerMouseMove: function(b) {
				var c = this.chart;
				l(a.hoverChartIndex) && G[a.hoverChartIndex] && G[a.hoverChartIndex].mouseIsDown || (a.hoverChartIndex = c.index);
				b = this.normalize(b);
				b.returnValue = !1;
				"mousedown" === c.mouseIsDown && this.drag(b);
				!this.inClass(b.target, "highcharts-tracker") && !c.isInsidePlot(b.chartX - c.plotLeft, b.chartY - c.plotTop) || c.openMenu || this.runPointActions(b)
			},
			inClass: function(a, c) {
				for (var b; a;) {
					if (b = B(a, "class")) {
						if (-1 !== b.indexOf(c)) return !0;
						if (-1 !== b.indexOf("highcharts-container")) return !1
					}
					a = a.parentNode
				}
			},
			onTrackerMouseOut: function(a) {
				var b = this.chart.hoverSeries;
				a = a.relatedTarget || a.toElement;
				this.isDirectTouch = !1;
				if (!(!b || !a || b.stickyTracking || this.inClass(a, "highcharts-tooltip") || this.inClass(a, "highcharts-series-" + b.index) && this.inClass(a, "highcharts-tracker"))) b.onMouseOut()
			},
			onContainerClick: function(a) {
				var b = this.chart,
					c = b.hoverPoint,
					f = b.plotLeft,
					e = b.plotTop;
				a = this.normalize(a);
				b.cancelClick || (c && this.inClass(a.target, "highcharts-tracker") ? (v(c.series, "click", n(a, {
					point: c
				})), b.hoverPoint && c.firePointEvent("click", a)) : (n(a, this.getCoordinates(a)), b.isInsidePlot(a.chartX - f, a.chartY - e) && v(b, "click", a)))
			},
			setDOMEvents: function() {
				var b = this,
					c = b.chart.container,
					f = c.ownerDocument;
				c.onmousedown = function(a) {
					b.onContainerMouseDown(a)
				};
				c.onmousemove = function(a) {
					b.onContainerMouseMove(a)
				};
				c.onclick = function(a) {
					b.onContainerClick(a)
				};
				this.unbindContainerMouseLeave = D(c, "mouseleave", b.onContainerMouseLeave);
				a.unbindDocumentMouseUp || (a.unbindDocumentMouseUp = D(f, "mouseup", b.onDocumentMouseUp));
				a.hasTouch && (c.ontouchstart = function(a) {
					b.onContainerTouchStart(a)
				}, c.ontouchmove = function(a) {
					b.onContainerTouchMove(a)
				}, a.unbindDocumentTouchEnd || (a.unbindDocumentTouchEnd = D(f, "touchend", b.onDocumentTouchEnd)))
			},
			destroy: function() {
				var b = this;
				b.unDocMouseMove && b.unDocMouseMove();
				this.unbindContainerMouseLeave();
				a.chartCount || (a.unbindDocumentMouseUp && (a.unbindDocumentMouseUp = a.unbindDocumentMouseUp()), a.unbindDocumentTouchEnd && (a.unbindDocumentTouchEnd = a.unbindDocumentTouchEnd()));
				clearInterval(b.tooltipTimeout);
				a.objectEach(b, function(a, c) {
					b[c] = null
				})
			}
		}
	})(N);
	(function(a) {
		var D = a.charts,
			B = a.each,
			G = a.extend,
			p = a.map,
			g = a.noop,
			l = a.pick;
		G(a.Pointer.prototype, {
			pinchTranslate: function(a, g, l, p, e, h) {
				this.zoomHor && this.pinchTranslateDirection(!0, a, g, l, p, e, h);
				this.zoomVert && this.pinchTranslateDirection(!1, a, g, l, p, e, h)
			},
			pinchTranslateDirection: function(a, g, l, p, e, h, m, c) {
				var f = this.chart,
					b = a ? "x" : "y",
					d = a ? "X" : "Y",
					y = "chart" + d,
					n = a ? "width" : "height",
					r = f["plot" + (a ? "Left" : "Top")],
					t, v, x = c || 1,
					C = f.inverted,
					w = f.bounds[a ? "h" : "v"],
					q = 1 === g.length,
					A = g[0][y],
					E = l[0][y],
					F = !q && g[1][y],
					k = !q && l[1][y],
					u;
				l = function() {
					!q && 20 < Math.abs(A - F) && (x = c || Math.abs(E - k) / Math.abs(A - F));
					v = (r - E) / x + A;
					t = f["plot" + (a ? "Width" : "Height")] / x
				};
				l();
				g = v;
				g < w.min ? (g = w.min, u = !0) : g + t > w.max && (g = w.max - t, u = !0);
				u ? (E -= .8 * (E - m[b][0]), q || (k -= .8 * (k - m[b][1])), l()) : m[b] = [E, k];
				C || (h[b] = v - r, h[n] = t);
				h = C ? 1 / x : x;
				e[n] = t;
				e[b] = g;
				p[C ? a ? "scaleY" : "scaleX" : "scale" + d] = x;
				p["translate" + d] = h * r + (E - h * A)
			},
			pinch: function(a) {
				var n = this,
					r = n.chart,
					v = n.pinchDown,
					e = a.touches,
					h = e.length,
					m = n.lastValidTouch,
					c = n.hasZoom,
					f = n.selectionMarker,
					b = {},
					d = 1 === h && (n.inClass(a.target, "highcharts-tracker") && r.runTrackerClick || n.runChartClick),
					y = {};
				1 < h && (n.initiated = !0);
				c && n.initiated && !d && a.preventDefault();
				p(e, function(a) {
					return n.normalize(a)
				});
				"touchstart" === a.type ? (B(e, function(a, b) {
					v[b] = {
						chartX: a.chartX,
						chartY: a.chartY
					}
				}), m.x = [v[0].chartX, v[1] && v[1].chartX], m.y = [v[0].chartY, v[1] && v[1].chartY], B(r.axes, function(a) {
					if (a.zoomEnabled) {
						var b = r.bounds[a.horiz ? "h" : "v"],
							c = a.minPixelPadding,
							f = a.toPixels(l(a.options.min, a.dataMin)),
							d = a.toPixels(l(a.options.max, a.dataMax)),
							e = Math.max(f, d);
						b.min = Math.min(a.pos, Math.min(f, d) - c);
						b.max = Math.max(a.pos + a.len, e + c)
					}
				}), n.res = !0) : n.followTouchMove && 1 === h ? this.runPointActions(n.normalize(a)) : v.length && (f || (n.selectionMarker = f = G({
					destroy: g,
					touch: !0
				}, r.plotBox)), n.pinchTranslate(v, e, b, f, y, m), n.hasPinched = c, n.scaleGroups(b, y), n.res && (n.res = !1, this.reset(!1, 0)))
			},
			touch: function(g, n) {
				var r = this.chart,
					p, e;
				if (r.index !== a.hoverChartIndex) this.onContainerMouseLeave({
					relatedTarget: !0
				});
				a.hoverChartIndex = r.index;
				1 === g.touches.length ? (g = this.normalize(g), (e = r.isInsidePlot(g.chartX - r.plotLeft, g.chartY - r.plotTop)) && !r.openMenu ? (n && this.runPointActions(g), "touchmove" === g.type && (n = this.pinchDown, p = n[0] ? 4 <= Math.sqrt(Math.pow(n[0].chartX - g.chartX, 2) + Math.pow(n[0].chartY - g.chartY, 2)) : !1), l(p, !0) && this.pinch(g)) : n && this.reset()) : 2 === g.touches.length && this.pinch(g)
			},
			onContainerTouchStart: function(a) {
				this.zoomOption(a);
				this.touch(a, !0)
			},
			onContainerTouchMove: function(a) {
				this.touch(a)
			},
			onDocumentTouchEnd: function(g) {
				D[a.hoverChartIndex] && D[a.hoverChartIndex].pointer.drop(g)
			}
		})
	})(N);
	(function(a) {
		var D = a.addEvent,
			B = a.charts,
			G = a.css,
			p = a.doc,
			g = a.extend,
			l = a.noop,
			r = a.Pointer,
			n = a.removeEvent,
			w = a.win,
			v = a.wrap;
		if (!a.hasTouch && (w.PointerEvent || w.MSPointerEvent)) {
			var e = {},
				h = !! w.PointerEvent,
				m = function() {
					var c = [];
					c.item = function(a) {
						return this[a]
					};
					a.objectEach(e, function(a) {
						c.push({
							pageX: a.pageX,
							pageY: a.pageY,
							target: a.target
						})
					});
					return c
				},
				c = function(c, b, d, e) {
					"touch" !== c.pointerType && c.pointerType !== c.MSPOINTER_TYPE_TOUCH || !B[a.hoverChartIndex] || (e(c), e = B[a.hoverChartIndex].pointer, e[b]({
						type: d,
						target: c.currentTarget,
						preventDefault: l,
						touches: m()
					}))
				};
			g(r.prototype, {
				onContainerPointerDown: function(a) {
					c(a, "onContainerTouchStart", "touchstart", function(a) {
						e[a.pointerId] = {
							pageX: a.pageX,
							pageY: a.pageY,
							target: a.currentTarget
						}
					})
				},
				onContainerPointerMove: function(a) {
					c(a, "onContainerTouchMove", "touchmove", function(a) {
						e[a.pointerId] = {
							pageX: a.pageX,
							pageY: a.pageY
						};
						e[a.pointerId].target || (e[a.pointerId].target = a.currentTarget)
					})
				},
				onDocumentPointerUp: function(a) {
					c(a, "onDocumentTouchEnd", "touchend", function(a) {
						delete e[a.pointerId]
					})
				},
				batchMSEvents: function(a) {
					a(this.chart.container, h ? "pointerdown" : "MSPointerDown", this.onContainerPointerDown);
					a(this.chart.container, h ? "pointermove" : "MSPointerMove", this.onContainerPointerMove);
					a(p, h ? "pointerup" : "MSPointerUp", this.onDocumentPointerUp)
				}
			});
			v(r.prototype, "init", function(a, b, c) {
				a.call(this, b, c);
				this.hasZoom && G(b.container, {
					"-ms-touch-action": "none",
					"touch-action": "none"
				})
			});
			v(r.prototype, "setDOMEvents", function(a) {
				a.apply(this);
				(this.hasZoom || this.followTouchMove) && this.batchMSEvents(D)
			});
			v(r.prototype, "destroy", function(a) {
				this.batchMSEvents(n);
				a.call(this)
			})
		}
	})(N);
	(function(a) {
		var D = a.addEvent,
			B = a.css,
			G = a.discardElement,
			p = a.defined,
			g = a.each,
			l = a.isFirefox,
			r = a.marginNames,
			n = a.merge,
			w = a.pick,
			v = a.setAnimation,
			e = a.stableSort,
			h = a.win,
			m = a.wrap;
		a.Legend = function(a, f) {
			this.init(a, f)
		};
		a.Legend.prototype = {
			init: function(a, f) {
				this.chart = a;
				this.setOptions(f);
				f.enabled && (this.render(), D(this.chart, "endResize", function() {
					this.legend.positionCheckboxes()
				}))
			},
			setOptions: function(a) {
				var c = w(a.padding, 8);
				this.options = a;
				this.itemStyle = a.itemStyle;
				this.itemHiddenStyle = n(this.itemStyle, a.itemHiddenStyle);
				this.itemMarginTop = a.itemMarginTop || 0;
				this.padding = c;
				this.initialItemY = c - 5;
				this.itemHeight = this.maxItemWidth = 0;
				this.symbolWidth = w(a.symbolWidth, 16);
				this.pages = []
			},
			update: function(a, f) {
				var b = this.chart;
				this.setOptions(n(!0, this.options, a));
				this.destroy();
				b.isDirtyLegend = b.isDirtyBox = !0;
				w(f, !0) && b.redraw()
			},
			colorizeItem: function(a, f) {
				a.legendGroup[f ? "removeClass" : "addClass"]("highcharts-legend-item-hidden");
				var b = this.options,
					c = a.legendItem,
					e = a.legendLine,
					h = a.legendSymbol,
					g = this.itemHiddenStyle.color,
					b = f ? b.itemStyle.color : g,
					m = f ? a.color || g : g,
					l = a.options && a.options.marker,
					x = {
						fill: m
					};
				c && c.css({
					fill: b,
					color: b
				});
				e && e.attr({
					stroke: m
				});
				h && (l && h.isMarker && (x = a.pointAttribs(), f || (x.stroke = x.fill = g)), h.attr(x))
			},
			positionItem: function(a) {
				var c = this.options,
					b = c.symbolPadding,
					c = !c.rtl,
					d = a._legendItemPos,
					e = d[0],
					d = d[1],
					h = a.checkbox;
				(a = a.legendGroup) && a.element && a.translate(c ? e : this.legendWidth - e - 2 * b - 4, d);
				h && (h.x = e, h.y = d)
			},
			destroyItem: function(a) {
				var c = a.checkbox;
				g(["legendItem", "legendLine", "legendSymbol", "legendGroup"], function(b) {
					a[b] && (a[b] = a[b].destroy())
				});
				c && G(a.checkbox)
			},
			destroy: function() {
				function a(a) {
					this[a] && (this[a] = this[a].destroy())
				}
				g(this.getAllItems(), function(c) {
					g(["legendItem", "legendGroup"], a, c)
				});
				g("clipRect up down pager nav box title group".split(" "), a, this);
				this.display = null
			},
			positionCheckboxes: function() {
				var a = this.group && this.group.alignAttr,
					f, b = this.clipHeight || this.legendHeight,
					d = this.titleHeight;
				a && (f = a.translateY, g(this.allItems, function(c) {
					var e = c.checkbox,
						h;
					e && (h = f + d + e.y + (this.scrollOffset || 0) + 3, B(e, {
						left: a.translateX + c.checkboxOffset + e.x - 20 + "px",
						top: h + "px",
						display: h > f - 6 && h < f + b - 6 ? "" : "none"
					}))
				}, this))
			},
			renderTitle: function() {
				var a = this.options,
					f = this.padding,
					b = a.title,
					d = 0;
				b.text && (this.title || (this.title = this.chart.renderer.label(b.text, f - 3, f - 4, null, null, null, a.useHTML, null, "legend-title").attr({
					zIndex: 1
				}).css(b.style).add(this.group)), a = this.title.getBBox(), d = a.height, this.offsetWidth = a.width, this.contentGroup.attr({
					translateY: d
				}));
				this.titleHeight = d
			},
			setText: function(c) {
				var f = this.options;
				c.legendItem.attr({
					text: f.labelFormat ? a.format(f.labelFormat, c) : f.labelFormatter.call(c)
				})
			},
			renderItem: function(a) {
				var c = this.chart,
					b = c.renderer,
					d = this.options,
					e = "horizontal" === d.layout,
					h = this.symbolWidth,
					g = d.symbolPadding,
					m = this.itemStyle,
					l = this.itemHiddenStyle,
					x = this.padding,
					C = e ? w(d.itemDistance, 20) : 0,
					r = !d.rtl,
					q = d.width,
					A = d.itemMarginBottom || 0,
					E = this.itemMarginTop,
					F = a.legendItem,
					k = !a.series,
					u = !k && a.series.drawLegendSymbol ? a.series : a,
					p = u.options,
					v = this.createCheckboxForItem && p && p.showCheckbox,
					p = h + g + C + (v ? 20 : 0),
					P = d.useHTML,
					I = a.options.className;
				F || (a.legendGroup = b.g("legend-item").addClass("highcharts-" + u.type + "-series highcharts-color-" + a.colorIndex + (I ? " " + I : "") + (k ? " highcharts-series-" + a.index : "")).attr({
					zIndex: 1
				}).add(this.scrollGroup), a.legendItem = F = b.text("", r ? h + g : -g, this.baseline || 0, P).css(n(a.visible ? m : l)).attr({
					align: r ? "left" : "right",
					zIndex: 2
				}).add(a.legendGroup), this.baseline || (h = m.fontSize, this.fontMetrics = b.fontMetrics(h, F), this.baseline = this.fontMetrics.f + 3 + E, F.attr("y", this.baseline)), this.symbolHeight = d.symbolHeight || this.fontMetrics.f, u.drawLegendSymbol(this, a), this.setItemEvents && this.setItemEvents(a, F, P), v && this.createCheckboxForItem(a));
				this.colorizeItem(a, a.visible);
				m.width || F.css({
					width: (d.itemWidth || d.width || c.spacingBox.width) - p
				});
				this.setText(a);
				b = F.getBBox();
				m = a.checkboxOffset = d.itemWidth || a.legendItemWidth || b.width + p;
				this.itemHeight = b = Math.round(a.legendItemHeight || b.height || this.symbolHeight);
				e && this.itemX - x + m > (q || c.spacingBox.width - 2 * x - d.x) && (this.itemX = x, this.itemY += E + this.lastLineHeight + A, this.lastLineHeight = 0);
				this.maxItemWidth = Math.max(this.maxItemWidth, m);
				this.lastItemY = E + this.itemY + A;
				this.lastLineHeight = Math.max(b, this.lastLineHeight);
				a._legendItemPos = [this.itemX, this.itemY];
				e ? this.itemX += m : (this.itemY += E + b + A, this.lastLineHeight = b);
				this.offsetWidth = q || Math.max((e ? this.itemX - x - (a.checkbox ? 0 : C) : m) + x, this.offsetWidth)
			},
			getAllItems: function() {
				var a = [];
				g(this.chart.series, function(c) {
					var b = c && c.options;
					c && w(b.showInLegend, p(b.linkedTo) ? !1 : void 0, !0) && (a = a.concat(c.legendItems || ("point" === b.legendType ? c.data : c)))
				});
				return a
			},
			adjustMargins: function(a, f) {
				var b = this.chart,
					c = this.options,
					e = c.align.charAt(0) + c.verticalAlign.charAt(0) + c.layout.charAt(0);
				c.floating || g([/(lth|ct|rth)/, /(rtv|rm|rbv)/, /(rbh|cb|lbh)/, /(lbv|lm|ltv)/], function(d, h) {
					d.test(e) && !p(a[h]) && (b[r[h]] = Math.max(b[r[h]], b.legend[(h + 1) % 2 ? "legendHeight" : "legendWidth"] + [1, -1, -1, 1][h] * c[h % 2 ? "x" : "y"] + w(c.margin, 12) + f[h]))
				})
			},
			render: function() {
				var a = this,
					f = a.chart,
					b = f.renderer,
					d = a.group,
					h, m, l, t, p = a.box,
					x = a.options,
					r = a.padding;
				a.itemX = r;
				a.itemY = a.initialItemY;
				a.offsetWidth = 0;
				a.lastItemY = 0;
				d || (a.group = d = b.g("legend").attr({
					zIndex: 7
				}).add(), a.contentGroup = b.g().attr({
					zIndex: 1
				}).add(d), a.scrollGroup = b.g().add(a.contentGroup));
				a.renderTitle();
				h = a.getAllItems();
				e(h, function(a, b) {
					return (a.options && a.options.legendIndex || 0) - (b.options && b.options.legendIndex || 0)
				});
				x.reversed && h.reverse();
				a.allItems = h;
				a.display = m = !! h.length;
				a.lastLineHeight = 0;
				g(h, function(b) {
					a.renderItem(b)
				});
				l = (x.width || a.offsetWidth) + r;
				t = a.lastItemY + a.lastLineHeight + a.titleHeight;
				t = a.handleOverflow(t);
				t += r;
				p || (a.box = p = b.rect().addClass("highcharts-legend-box").attr({
					r: x.borderRadius
				}).add(d), p.isNew = !0);
				p.attr({
					stroke: x.borderColor,
					"stroke-width": x.borderWidth || 0,
					fill: x.backgroundColor || "none"
				}).shadow(x.shadow);
				0 < l && 0 < t && (p[p.isNew ? "attr" : "animate"](p.crisp.call({}, {
					x: 0,
					y: 0,
					width: l,
					height: t
				}, p.strokeWidth())), p.isNew = !1);
				p[m ? "show" : "hide"]();
				a.legendWidth = l;
				a.legendHeight = t;
				g(h, function(b) {
					a.positionItem(b)
				});
				m && d.align(n(x, {
					width: l,
					height: t
				}), !0, "spacingBox");
				f.isResizing || this.positionCheckboxes()
			},
			handleOverflow: function(a) {
				var c = this,
					b = this.chart,
					d = b.renderer,
					e = this.options,
					h = e.y,
					m = this.padding,
					b = b.spacingBox.height + ("top" === e.verticalAlign ? -h : h) - m,
					h = e.maxHeight,
					l, n = this.clipRect,
					x = e.navigation,
					p = w(x.animation, !0),
					r = x.arrowSize || 12,
					q = this.nav,
					A = this.pages,
					E, F = this.allItems,
					k = function(a) {
						"number" === typeof a ? n.attr({
							height: a
						}) : n && (c.clipRect = n.destroy(), c.contentGroup.clip());
						c.contentGroup.div && (c.contentGroup.div.style.clip = a ? "rect(" + m + "px,9999px," + (m + a) + "px,0)" : "auto")
					};
				"horizontal" !== e.layout || "middle" === e.verticalAlign || e.floating || (b /= 2);
				h && (b = Math.min(b, h));
				A.length = 0;
				a > b && !1 !== x.enabled ? (this.clipHeight = l = Math.max(b - 20 - this.titleHeight - m, 0), this.currentPage = w(this.currentPage, 1), this.fullHeight = a, g(F, function(a, b) {
					var c = a._legendItemPos[1];
					a = Math.round(a.legendItem.getBBox().height);
					var d = A.length;
					if (!d || c - A[d - 1] > l && (E || c) !== A[d - 1]) A.push(E || c), d++;
					b === F.length - 1 && c + a - A[d - 1] > l && A.push(c);
					c !== E && (E = c)
				}), n || (n = c.clipRect = d.clipRect(0, m, 9999, 0), c.contentGroup.clip(n)), k(l), q || (this.nav = q = d.g().attr({
					zIndex: 1
				}).add(this.group), this.up = d.symbol("triangle", 0, 0, r, r).on("click", function() {
					c.scroll(-1, p)
				}).add(q), this.pager = d.text("", 15, 10).addClass("highcharts-legend-navigation").css(x.style).add(q), this.down = d.symbol("triangle-down", 0, 0, r, r).on("click", function() {
					c.scroll(1, p)
				}).add(q)), c.scroll(0), a = b) : q && (k(), this.nav = q.destroy(), this.scrollGroup.attr({
					translateY: 1
				}), this.clipHeight = 0);
				return a
			},
			scroll: function(a, f) {
				var b = this.pages,
					c = b.length;
				a = this.currentPage + a;
				var e = this.clipHeight,
					h = this.options.navigation,
					g = this.pager,
					m = this.padding;
				a > c && (a = c);
				0 < a && (void 0 !== f && v(f, this.chart), this.nav.attr({
					translateX: m,
					translateY: e + this.padding + 7 + this.titleHeight,
					visibility: "visible"
				}), this.up.attr({
					"class": 1 === a ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active"
				}), g.attr({
					text: a + "/" + c
				}), this.down.attr({
					x: 18 + this.pager.getBBox().width,
					"class": a === c ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active"
				}), this.up.attr({
					fill: 1 === a ? h.inactiveColor : h.activeColor
				}).css({
					cursor: 1 === a ? "default" : "pointer"
				}), this.down.attr({
					fill: a === c ? h.inactiveColor : h.activeColor
				}).css({
					cursor: a === c ? "default" : "pointer"
				}), this.scrollOffset = -b[a - 1] + this.initialItemY, this.scrollGroup.animate({
					translateY: this.scrollOffset
				}), this.currentPage = a, this.positionCheckboxes())
			}
		};
		a.LegendSymbolMixin = {
			drawRectangle: function(a, f) {
				var b = a.symbolHeight,
					c = a.options.squareSymbol;
				f.legendSymbol = this.chart.renderer.rect(c ? (a.symbolWidth - b) / 2 : 0, a.baseline - b + 1, c ? b : a.symbolWidth, b, w(a.options.symbolRadius, b / 2)).addClass("highcharts-point").attr({
					zIndex: 3
				}).add(f.legendGroup)
			},
			drawLineMarker: function(a) {
				var c = this.options,
					b = c.marker,
					d = a.symbolWidth,
					e = a.symbolHeight,
					h = e / 2,
					g = this.chart.renderer,
					m = this.legendGroup;
				a = a.baseline - Math.round(.3 * a.fontMetrics.b);
				var l;
				l = {
					"stroke-width": c.lineWidth || 0
				};
				c.dashStyle && (l.dashstyle = c.dashStyle);
				this.legendLine = g.path(["M", 0, a, "L", d, a]).addClass("highcharts-graph").attr(l).add(m);
				b && !1 !== b.enabled && (c = Math.min(w(b.radius, h), h), 0 === this.symbol.indexOf("url") && (b = n(b, {
					width: e,
					height: e
				}), c = 0), this.legendSymbol = b = g.symbol(this.symbol, d / 2 - c, a - c, 2 * c, 2 * c, b).addClass("highcharts-point").add(m), b.isMarker = !0)
			}
		};
		(/Trident\/7\.0/.test(h.navigator.userAgent) || l) && m(a.Legend.prototype, "positionItem", function(a, f) {
			var b = this,
				c = function() {
					f._legendItemPos && a.call(b, f)
				};
			c();
			setTimeout(c)
		})
	})(N);
	(function(a) {
		var D = a.addEvent,
			B = a.animate,
			G = a.animObject,
			p = a.attr,
			g = a.doc,
			l = a.Axis,
			r = a.createElement,
			n = a.defaultOptions,
			w = a.discardElement,
			v = a.charts,
			e = a.css,
			h = a.defined,
			m = a.each,
			c = a.extend,
			f = a.find,
			b = a.fireEvent,
			d = a.grep,
			y = a.isNumber,
			H = a.isObject,
			J = a.isString,
			t = a.Legend,
			K = a.marginNames,
			x = a.merge,
			C = a.objectEach,
			L = a.Pointer,
			q = a.pick,
			A = a.pInt,
			E = a.removeEvent,
			F = a.seriesTypes,
			k = a.splat,
			u = a.svg,
			R = a.syncTimeout,
			M = a.win,
			P = a.Chart = function() {
				this.getArgs.apply(this, arguments)
			};
		a.chart = function(a, b, c) {
			return new P(a, b, c)
		};
		c(P.prototype, {
			callbacks: [],
			getArgs: function() {
				var a = [].slice.call(arguments);
				if (J(a[0]) || a[0].nodeName) this.renderTo = a.shift();
				this.init(a[0], a[1])
			},
			init: function(b, c) {
				var d, f, k = b.series,
					e = b.plotOptions || {};
				b.series = null;
				d = x(n, b);
				for (f in d.plotOptions) d.plotOptions[f].tooltip = e[f] && x(e[f].tooltip) || void 0;
				d.tooltip.userOptions = b.chart && b.chart.forExport && b.tooltip.userOptions || b.tooltip;
				d.series = b.series = k;
				this.userOptions = b;
				b = d.chart;
				f = b.events;
				this.margin = [];
				this.spacing = [];
				this.bounds = {
					h: {},
					v: {}
				};
				this.labelCollectors = [];
				this.callback = c;
				this.isResizing = 0;
				this.options = d;
				this.axes = [];
				this.series = [];
				this.hasCartesianSeries = b.showAxes;
				var q = this;
				q.index = v.length;
				v.push(q);
				a.chartCount++;
				f && C(f, function(a, b) {
					D(q, b, a)
				});
				q.xAxis = [];
				q.yAxis = [];
				q.pointCount = q.colorCounter = q.symbolCounter = 0;
				q.firstRender()
			},
			initSeries: function(b) {
				var c = this.options.chart;
				(c = F[b.type || c.type || c.defaultSeriesType]) || a.error(17, !0);
				c = new c;
				c.init(this, b);
				return c
			},
			orderSeries: function(a) {
				var b = this.series;
				for (a = a || 0; a < b.length; a++) b[a] && (b[a].index = a, b[a].name = b[a].name || "Series " + (b[a].index + 1))
			},
			isInsidePlot: function(a, b, c) {
				var d = c ? b : a;
				a = c ? a : b;
				return 0 <= d && d <= this.plotWidth && 0 <= a && a <= this.plotHeight
			},
			redraw: function(d) {
				var f = this.axes,
					k = this.series,
					e = this.pointer,
					q = this.legend,
					h = this.isDirtyLegend,
					g, l, u = this.hasCartesianSeries,
					A = this.isDirtyBox,
					E, t = this.renderer,
					n = t.isHidden(),
					x = [];
				this.setResponsive && this.setResponsive(!1);
				a.setAnimation(d, this);
				n && this.temporaryDisplay();
				this.layOutTitles();
				for (d = k.length; d--;) if (E = k[d], E.options.stacking && (g = !0, E.isDirty)) {
					l = !0;
					break
				}
				if (l) for (d = k.length; d--;) E = k[d], E.options.stacking && (E.isDirty = !0);
				m(k, function(a) {
					a.isDirty && "point" === a.options.legendType && (a.updateTotals && a.updateTotals(), h = !0);
					a.isDirtyData && b(a, "updatedData")
				});
				h && q.options.enabled && (q.render(), this.isDirtyLegend = !1);
				g && this.getStacks();
				u && m(f, function(a) {
					a.updateNames();
					a.setScale()
				});
				this.getMargins();
				u && (m(f, function(a) {
					a.isDirty && (A = !0)
				}), m(f, function(a) {
					var d = a.min + "," + a.max;
					a.extKey !== d && (a.extKey = d, x.push(function() {
						b(a, "afterSetExtremes", c(a.eventArgs, a.getExtremes()));
						delete a.eventArgs
					}));
					(A || g) && a.redraw()
				}));
				A && this.drawChartBox();
				b(this, "predraw");
				m(k, function(a) {
					(A || a.isDirty) && a.visible && a.redraw();
					a.isDirtyData = !1
				});
				e && e.reset(!0);
				t.draw();
				b(this, "redraw");
				b(this, "render");
				n && this.temporaryDisplay(!0);
				m(x, function(a) {
					a.call()
				})
			},
			get: function(a) {
				function b(b) {
					return b.id === a || b.options && b.options.id === a
				}
				var c, d = this.series,
					k;
				c = f(this.axes, b) || f(this.series, b);
				for (k = 0; !c && k < d.length; k++) c = f(d[k].points || [], b);
				return c
			},
			getAxes: function() {
				var a = this,
					b = this.options,
					c = b.xAxis = k(b.xAxis || {}),
					b = b.yAxis = k(b.yAxis || {});
				m(c, function(a, b) {
					a.index = b;
					a.isX = !0
				});
				m(b, function(a, b) {
					a.index = b
				});
				c = c.concat(b);
				m(c, function(b) {
					new l(a, b)
				})
			},
			getSelectedPoints: function() {
				var a = [];
				m(this.series, function(b) {
					a = a.concat(d(b.data || [], function(a) {
						return a.selected
					}))
				});
				return a
			},
			getSelectedSeries: function() {
				return d(this.series, function(a) {
					return a.selected
				})
			},
			setTitle: function(a, b, c) {
				var d = this,
					f = d.options,
					k;
				k = f.title = x({
					style: {
						color: "#333333",
						fontSize: f.isStock ? "16px" : "18px"
					}
				}, f.title, a);
				f = f.subtitle = x({
					style: {
						color: "#666666"
					}
				}, f.subtitle, b);
				m([
					["title", a, k],
					["subtitle", b, f]
				], function(a, b) {
					var c = a[0],
						f = d[c],
						k = a[1];
					a = a[2];
					f && k && (d[c] = f = f.destroy());
					a && !f && (d[c] = d.renderer.text(a.text, 0, 0, a.useHTML).attr({
						align: a.align,
						"class": "highcharts-" + c,
						zIndex: a.zIndex || 4
					}).add(), d[c].update = function(a) {
						d.setTitle(!b && a, b && a)
					}, d[c].css(a.style))
				});
				d.layOutTitles(c)
			},
			layOutTitles: function(a) {
				var b = 0,
					d, f = this.renderer,
					k = this.spacingBox;
				m(["title", "subtitle"], function(a) {
					var d = this[a],
						e = this.options[a];
					a = "title" === a ? -3 : e.verticalAlign ? 0 : b + 2;
					var q;
					d && (q = e.style.fontSize, q = f.fontMetrics(q, d).b, d.css({
						width: (e.width || k.width + e.widthAdjust) + "px"
					}).align(c({
						y: a + q
					}, e), !1, "spacingBox"), e.floating || e.verticalAlign || (b = Math.ceil(b + d.getBBox(e.useHTML).height)))
				}, this);
				d = this.titleOffset !== b;
				this.titleOffset = b;
				!this.isDirtyBox && d && (this.isDirtyBox = d, this.hasRendered && q(a, !0) && this.isDirtyBox && this.redraw())
			},
			getChartSize: function() {
				var b = this.options.chart,
					c = b.width,
					b = b.height,
					d = this.renderTo;
				h(c) || (this.containerWidth = a.getStyle(d, "width"));
				h(b) || (this.containerHeight = a.getStyle(d, "height"));
				this.chartWidth = Math.max(0, c || this.containerWidth || 600);
				this.chartHeight = Math.max(0, a.relativeLength(b, this.chartWidth) || (1 < this.containerHeight ? this.containerHeight : 400))
			},
			temporaryDisplay: function(b) {
				var c = this.renderTo;
				if (b) for (; c && c.style;) c.hcOrigStyle && (a.css(c, c.hcOrigStyle), delete c.hcOrigStyle), c.hcOrigDetached && (g.body.removeChild(c), c.hcOrigDetached = !1), c = c.parentNode;
				else for (; c && c.style;) {
					g.body.contains(c) || c.parentNode || (c.hcOrigDetached = !0, g.body.appendChild(c));
					if ("none" === a.getStyle(c, "display", !1) || c.hcOricDetached) c.hcOrigStyle = {
						display: c.style.display,
						height: c.style.height,
						overflow: c.style.overflow
					}, b = {
						display: "block",
						overflow: "hidden"
					}, c !== this.renderTo && (b.height = 0), a.css(c, b), c.offsetWidth || c.style.setProperty("display", "block", "important");
					c = c.parentNode;
					if (c === g.body) break
				}
			},
			setClassName: function(a) {
				this.container.className = "highcharts-container " + (a || "")
			},
			getContainer: function() {
				var b, d = this.options,
					f = d.chart,
					k, e;
				b = this.renderTo;
				var q = a.uniqueKey(),
					h;
				b || (this.renderTo = b = f.renderTo);
				J(b) && (this.renderTo = b = g.getElementById(b));
				b || a.error(13, !0);
				k = A(p(b, "data-highcharts-chart"));
				y(k) && v[k] && v[k].hasRendered && v[k].destroy();
				p(b, "data-highcharts-chart", this.index);
				b.innerHTML = "";
				f.skipClone || b.offsetWidth || this.temporaryDisplay();
				this.getChartSize();
				k = this.chartWidth;
				e = this.chartHeight;
				h = c({
					position: "relative",
					overflow: "hidden",
					width: k + "px",
					height: e + "px",
					textAlign: "left",
					lineHeight: "normal",
					zIndex: 0,
					"-webkit-tap-highlight-color": "rgba(0,0,0,0)"
				}, f.style);
				this.container = b = r("div", {
					id: q
				}, h, b);
				this._cursor = b.style.cursor;
				this.renderer = new(a[f.renderer] || a.Renderer)(b, k, e, null, f.forExport, d.exporting && d.exporting.allowHTML);
				this.setClassName(f.className);
				this.renderer.setStyle(f.style);
				this.renderer.chartIndex = this.index
			},
			getMargins: function(a) {
				var b = this.spacing,
					c = this.margin,
					d = this.titleOffset;
				this.resetMargins();
				d && !h(c[0]) && (this.plotTop = Math.max(this.plotTop, d + this.options.title.margin + b[0]));
				this.legend && this.legend.display && this.legend.adjustMargins(c, b);
				this.extraMargin && (this[this.extraMargin.type] = (this[this.extraMargin.type] || 0) + this.extraMargin.value);
				this.adjustPlotArea && this.adjustPlotArea();
				a || this.getAxisMargins()
			},
			getAxisMargins: function() {
				var a = this,
					b = a.axisOffset = [0, 0, 0, 0],
					c = a.margin;
				a.hasCartesianSeries && m(a.axes, function(a) {
					a.visible && a.getOffset()
				});
				m(K, function(d, f) {
					h(c[f]) || (a[d] += b[f])
				});
				a.setChartSize()
			},
			reflow: function(b) {
				var c = this,
					d = c.options.chart,
					f = c.renderTo,
					k = h(d.width) && h(d.height),
					e = d.width || a.getStyle(f, "width"),
					d = d.height || a.getStyle(f, "height"),
					f = b ? b.target : M;
				if (!k && !c.isPrinting && e && d && (f === M || f === g)) {
					if (e !== c.containerWidth || d !== c.containerHeight) clearTimeout(c.reflowTimeout), c.reflowTimeout = R(function() {
						c.container && c.setSize(void 0, void 0, !1)
					}, b ? 100 : 0);
					c.containerWidth = e;
					c.containerHeight = d
				}
			},
			initReflow: function() {
				var a = this,
					b;
				b = D(M, "resize", function(b) {
					a.reflow(b)
				});
				D(a, "destroy", b)
			},
			setSize: function(c, d, f) {
				var k = this,
					q = k.renderer;
				k.isResizing += 1;
				a.setAnimation(f, k);
				k.oldChartHeight = k.chartHeight;
				k.oldChartWidth = k.chartWidth;
				void 0 !== c && (k.options.chart.width = c);
				void 0 !== d && (k.options.chart.height = d);
				k.getChartSize();
				c = q.globalAnimation;
				(c ? B : e)(k.container, {
					width: k.chartWidth + "px",
					height: k.chartHeight + "px"
				}, c);
				k.setChartSize(!0);
				q.setSize(k.chartWidth, k.chartHeight, f);
				m(k.axes, function(a) {
					a.isDirty = !0;
					a.setScale()
				});
				k.isDirtyLegend = !0;
				k.isDirtyBox = !0;
				k.layOutTitles();
				k.getMargins();
				k.redraw(f);
				k.oldChartHeight = null;
				b(k, "resize");
				R(function() {
					k && b(k, "endResize", null, function() {
						--k.isResizing
					})
				}, G(c).duration)
			},
			setChartSize: function(a) {
				var b = this.inverted,
					c = this.renderer,
					d = this.chartWidth,
					k = this.chartHeight,
					f = this.options.chart,
					e = this.spacing,
					q = this.clipOffset,
					h, g, l, u;
				this.plotLeft = h = Math.round(this.plotLeft);
				this.plotTop = g = Math.round(this.plotTop);
				this.plotWidth = l = Math.max(0, Math.round(d - h - this.marginRight));
				this.plotHeight = u = Math.max(0, Math.round(k - g - this.marginBottom));
				this.plotSizeX = b ? u : l;
				this.plotSizeY = b ? l : u;
				this.plotBorderWidth = f.plotBorderWidth || 0;
				this.spacingBox = c.spacingBox = {
					x: e[3],
					y: e[0],
					width: d - e[3] - e[1],
					height: k - e[0] - e[2]
				};
				this.plotBox = c.plotBox = {
					x: h,
					y: g,
					width: l,
					height: u
				};
				d = 2 * Math.floor(this.plotBorderWidth / 2);
				b = Math.ceil(Math.max(d, q[3]) / 2);
				c = Math.ceil(Math.max(d, q[0]) / 2);
				this.clipBox = {
					x: b,
					y: c,
					width: Math.floor(this.plotSizeX - Math.max(d, q[1]) / 2 - b),
					height: Math.max(0, Math.floor(this.plotSizeY - Math.max(d, q[2]) / 2 - c))
				};
				a || m(this.axes, function(a) {
					a.setAxisSize();
					a.setAxisTranslation()
				})
			},
			resetMargins: function() {
				var a = this,
					b = a.options.chart;
				m(["margin", "spacing"], function(c) {
					var d = b[c],
						k = H(d) ? d : [d, d, d, d];
					m(["Top", "Right", "Bottom", "Left"], function(d, f) {
						a[c][f] = q(b[c + d], k[f])
					})
				});
				m(K, function(b, c) {
					a[b] = q(a.margin[c], a.spacing[c])
				});
				a.axisOffset = [0, 0, 0, 0];
				a.clipOffset = [0, 0, 0, 0]
			},
			drawChartBox: function() {
				var a = this.options.chart,
					b = this.renderer,
					c = this.chartWidth,
					d = this.chartHeight,
					k = this.chartBackground,
					f = this.plotBackground,
					e = this.plotBorder,
					q, h = this.plotBGImage,
					g = a.backgroundColor,
					m = a.plotBackgroundColor,
					l = a.plotBackgroundImage,
					u, A = this.plotLeft,
					E = this.plotTop,
					t = this.plotWidth,
					n = this.plotHeight,
					x = this.plotBox,
					y = this.clipRect,
					F = this.clipBox,
					p = "animate";
				k || (this.chartBackground = k = b.rect().addClass("highcharts-background").add(), p = "attr");
				q = a.borderWidth || 0;
				u = q + (a.shadow ? 8 : 0);
				g = {
					fill: g || "none"
				};
				if (q || k["stroke-width"]) g.stroke = a.borderColor, g["stroke-width"] = q;
				k.attr(g).shadow(a.shadow);
				k[p]({
					x: u / 2,
					y: u / 2,
					width: c - u - q % 2,
					height: d - u - q % 2,
					r: a.borderRadius
				});
				p = "animate";
				f || (p = "attr", this.plotBackground = f = b.rect().addClass("highcharts-plot-background").add());
				f[p](x);
				f.attr({
					fill: m || "none"
				}).shadow(a.plotShadow);
				l && (h ? h.animate(x) : this.plotBGImage = b.image(l, A, E, t, n).add());
				y ? y.animate({
					width: F.width,
					height: F.height
				}) : this.clipRect = b.clipRect(F);
				p = "animate";
				e || (p = "attr", this.plotBorder = e = b.rect().addClass("highcharts-plot-border").attr({
					zIndex: 1
				}).add());
				e.attr({
					stroke: a.plotBorderColor,
					"stroke-width": a.plotBorderWidth || 0,
					fill: "none"
				});
				e[p](e.crisp({
					x: A,
					y: E,
					width: t,
					height: n
				}, -e.strokeWidth()));
				this.isDirtyBox = !1
			},
			propFromSeries: function() {
				var a = this,
					b = a.options.chart,
					c, d = a.options.series,
					k, f;
				m(["inverted", "angular", "polar"], function(e) {
					c = F[b.type || b.defaultSeriesType];
					f = b[e] || c && c.prototype[e];
					for (k = d && d.length; !f && k--;)(c = F[d[k].type]) && c.prototype[e] && (f = !0);
					a[e] = f
				})
			},
			linkSeries: function() {
				var a = this,
					b = a.series;
				m(b, function(a) {
					a.linkedSeries.length = 0
				});
				m(b, function(b) {
					var c = b.options.linkedTo;
					J(c) && (c = ":previous" === c ? a.series[b.index - 1] : a.get(c)) && c.linkedParent !== b && (c.linkedSeries.push(b), b.linkedParent = c, b.visible = q(b.options.visible, c.options.visible, b.visible))
				})
			},
			renderSeries: function() {
				m(this.series, function(a) {
					a.translate();
					a.render()
				})
			},
			renderLabels: function() {
				var a = this,
					b = a.options.labels;
				b.items && m(b.items, function(d) {
					var k = c(b.style, d.style),
						f = A(k.left) + a.plotLeft,
						e = A(k.top) + a.plotTop + 12;
					delete k.left;
					delete k.top;
					a.renderer.text(d.html, f, e).attr({
						zIndex: 2
					}).css(k).add()
				})
			},
			render: function() {
				var a = this.axes,
					b = this.renderer,
					c = this.options,
					d, k, f;
				this.setTitle();
				this.legend = new t(this, c.legend);
				this.getStacks && this.getStacks();
				this.getMargins(!0);
				this.setChartSize();
				c = this.plotWidth;
				d = this.plotHeight = Math.max(this.plotHeight - 21, 0);
				m(a, function(a) {
					a.setScale()
				});
				this.getAxisMargins();
				k = 1.1 < c / this.plotWidth;
				f = 1.05 < d / this.plotHeight;
				if (k || f) m(a, function(a) {
					(a.horiz && k || !a.horiz && f) && a.setTickInterval(!0)
				}), this.getMargins();
				this.drawChartBox();
				this.hasCartesianSeries && m(a, function(a) {
					a.visible && a.render()
				});
				this.seriesGroup || (this.seriesGroup = b.g("series-group").attr({
					zIndex: 3
				}).add());
				this.renderSeries();
				this.renderLabels();
				this.addCredits();
				this.setResponsive && this.setResponsive();
				this.hasRendered = !0
			},
			addCredits: function(a) {
				var b = this;
				a = x(!0, this.options.credits, a);
				a.enabled && !this.credits && (this.credits = this.renderer.text(a.text + (this.mapCredits || ""), 0, 0).addClass("highcharts-credits").on("click", function() {
					a.href && (M.location.href = a.href)
				}).attr({
					align: a.position.align,
					zIndex: 8
				}).css(a.style).add().align(a.position), this.credits.update = function(a) {
					b.credits = b.credits.destroy();
					b.addCredits(a)
				})
			},
			destroy: function() {
				var c = this,
					d = c.axes,
					k = c.series,
					f = c.container,
					e, q = f && f.parentNode;
				b(c, "destroy");
				c.renderer.forExport ? a.erase(v, c) : v[c.index] = void 0;
				a.chartCount--;
				c.renderTo.removeAttribute("data-highcharts-chart");
				E(c);
				for (e = d.length; e--;) d[e] = d[e].destroy();
				this.scroller && this.scroller.destroy && this.scroller.destroy();
				for (e = k.length; e--;) k[e] = k[e].destroy();
				m("title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" "), function(a) {
					var b = c[a];
					b && b.destroy && (c[a] = b.destroy())
				});
				f && (f.innerHTML = "", E(f), q && w(f));
				C(c, function(a, b) {
					delete c[b]
				})
			},
			isReadyToRender: function() {
				var a = this;
				return u || M != M.top || "complete" === g.readyState ? !0 : (g.attachEvent("onreadystatechange", function() {
					g.detachEvent("onreadystatechange", a.firstRender);
					"complete" === g.readyState && a.firstRender()
				}), !1)
			},
			firstRender: function() {
				var a = this,
					c = a.options;
				if (a.isReadyToRender()) {
					a.getContainer();
					b(a, "init");
					a.resetMargins();
					a.setChartSize();
					a.propFromSeries();
					a.getAxes();
					m(c.series || [], function(b) {
						a.initSeries(b)
					});
					a.linkSeries();
					b(a, "beforeRender");
					L && (a.pointer = new L(a, c));
					a.render();
					if (!a.renderer.imgCount && a.onload) a.onload();
					a.temporaryDisplay(!0)
				}
			},
			onload: function() {
				m([this.callback].concat(this.callbacks), function(a) {
					a && void 0 !== this.index && a.apply(this, [this])
				}, this);
				b(this, "load");
				b(this, "render");
				h(this.index) && !1 !== this.options.chart.reflow && this.initReflow();
				this.onload = null
			}
		})
	})(N);
	(function(a) {
		var D, B = a.each,
			G = a.extend,
			p = a.erase,
			g = a.fireEvent,
			l = a.format,
			r = a.isArray,
			n = a.isNumber,
			w = a.pick,
			v = a.removeEvent;
		a.Point = D = function() {};
		a.Point.prototype = {
			init: function(a, h, g) {
				this.series = a;
				this.color = a.color;
				this.applyOptions(h, g);
				a.options.colorByPoint ? (h = a.options.colors || a.chart.options.colors, this.color = this.color || h[a.colorCounter], h = h.length, g = a.colorCounter, a.colorCounter++, a.colorCounter === h && (a.colorCounter = 0)) : g = a.colorIndex;
				this.colorIndex = w(this.colorIndex, g);
				a.chart.pointCount++;
				return this
			},
			applyOptions: function(a, h) {
				var e = this.series,
					c = e.options.pointValKey || e.pointValKey;
				a = D.prototype.optionsToObject.call(this, a);
				G(this, a);
				this.options = this.options ? G(this.options, a) : a;
				a.group && delete this.group;
				c && (this.y = this[c]);
				this.isNull = w(this.isValid && !this.isValid(), null === this.x || !n(this.y, !0));
				this.selected && (this.state = "select");
				"name" in this && void 0 === h && e.xAxis && e.xAxis.hasNames && (this.x = e.xAxis.nameToX(this));
				void 0 === this.x && e && (this.x = void 0 === h ? e.autoIncrement(this) : h);
				return this
			},
			optionsToObject: function(a) {
				var e = {},
					g = this.series,
					c = g.options.keys,
					f = c || g.pointArrayMap || ["y"],
					b = f.length,
					d = 0,
					l = 0;
				if (n(a) || null === a) e[f[0]] = a;
				else if (r(a)) for (!c && a.length > b && (g = typeof a[0], "string" === g ? e.name = a[0] : "number" === g && (e.x = a[0]), d++); l < b;) c && void 0 === a[d] || (e[f[l]] = a[d]), d++, l++;
				else "object" === typeof a && (e = a, a.dataLabels && (g._hasPointLabels = !0), a.marker && (g._hasPointMarkers = !0));
				return e
			},
			getClassName: function() {
				return "highcharts-point" + (this.selected ? " highcharts-point-select" : "") + (this.negative ? " highcharts-negative" : "") + (this.isNull ? " highcharts-null-point" : "") + (void 0 !== this.colorIndex ? " highcharts-color-" + this.colorIndex : "") + (this.options.className ? " " + this.options.className : "") + (this.zone && this.zone.className ? " " + this.zone.className.replace("highcharts-negative", "") : "")
			},
			getZone: function() {
				var a = this.series,
					h = a.zones,
					a = a.zoneAxis || "y",
					g = 0,
					c;
				for (c = h[g]; this[a] >= c.value;) c = h[++g];
				c && c.color && !this.options.color && (this.color = c.color);
				return c
			},
			destroy: function() {
				var a = this.series.chart,
					h = a.hoverPoints,
					g;
				a.pointCount--;
				h && (this.setState(), p(h, this), h.length || (a.hoverPoints = null));
				if (this === a.hoverPoint) this.onMouseOut();
				if (this.graphic || this.dataLabel) v(this), this.destroyElements();
				this.legendItem && a.legend.destroyItem(this);
				for (g in this) this[g] = null
			},
			destroyElements: function() {
				for (var a = ["graphic", "dataLabel", "dataLabelUpper", "connector", "shadowGroup"], h, g = 6; g--;) h = a[g], this[h] && (this[h] = this[h].destroy())
			},
			getLabelConfig: function() {
				return {
					x: this.category,
					y: this.y,
					color: this.color,
					colorIndex: this.colorIndex,
					key: this.name || this.category,
					series: this.series,
					point: this,
					percentage: this.percentage,
					total: this.total || this.stackTotal
				}
			},
			tooltipFormatter: function(a) {
				var e = this.series,
					g = e.tooltipOptions,
					c = w(g.valueDecimals, ""),
					f = g.valuePrefix || "",
					b = g.valueSuffix || "";
				B(e.pointArrayMap || ["y"], function(d) {
					d = "{point." + d;
					if (f || b) a = a.replace(d + "}", f + d + "}" + b);
					a = a.replace(d + "}", d + ":,." + c + "f}")
				});
				return l(a, {
					point: this,
					series: this.series
				})
			},
			firePointEvent: function(a, h, m) {
				var c = this,
					f = this.series.options;
				(f.point.events[a] || c.options && c.options.events && c.options.events[a]) && this.importEvents();
				"click" === a && f.allowPointSelect && (m = function(a) {
					c.select && c.select(null, a.ctrlKey || a.metaKey || a.shiftKey)
				});
				g(this, a, h, m)
			},
			visible: !0
		}
	})(N);
	(function(a) {
		var D = a.addEvent,
			B = a.animObject,
			G = a.arrayMax,
			p = a.arrayMin,
			g = a.correctFloat,
			l = a.Date,
			r = a.defaultOptions,
			n = a.defaultPlotOptions,
			w = a.defined,
			v = a.each,
			e = a.erase,
			h = a.extend,
			m = a.fireEvent,
			c = a.grep,
			f = a.isArray,
			b = a.isNumber,
			d = a.isString,
			y = a.merge,
			H = a.objectEach,
			J = a.pick,
			t = a.removeEvent,
			K = a.splat,
			x = a.SVGElement,
			C = a.syncTimeout,
			L = a.win;
		a.Series = a.seriesType("line", null, {
			lineWidth: 2,
			allowPointSelect: !1,
			showCheckbox: !1,
			animation: {
				duration: 1E3
			},
			events: {},
			marker: {
				lineWidth: 0,
				lineColor: "#ffffff",
				radius: 4,
				states: {
					hover: {
						animation: {
							duration: 50
						},
						enabled: !0,
						radiusPlus: 2,
						lineWidthPlus: 1
					},
					select: {
						fillColor: "#cccccc",
						lineColor: "#000000",
						lineWidth: 2
					}
				}
			},
			point: {
				events: {}
			},
			dataLabels: {
				align: "center",
				formatter: function() {
					return null === this.y ? "" : a.numberFormat(this.y, -1)
				},
				style: {
					fontSize: "11px",
					fontWeight: "bold",
					color: "contrast",
					textOutline: "1px contrast"
				},
				verticalAlign: "bottom",
				x: 0,
				y: 0,
				padding: 5
			},
			cropThreshold: 300,
			pointRange: 0,
			softThreshold: !0,
			states: {
				hover: {
					animation: {
						duration: 50
					},
					lineWidthPlus: 1,
					marker: {},
					halo: {
						size: 10,
						opacity: .25
					}
				},
				select: {
					marker: {}
				}
			},
			stickyTracking: !0,
			turboThreshold: 1E3,
			findNearestPointBy: "x"
		}, {
			isCartesian: !0,
			pointClass: a.Point,
			sorted: !0,
			requireSorting: !0,
			directTouch: !1,
			axisTypes: ["xAxis", "yAxis"],
			colorCounter: 0,
			parallelArrays: ["x", "y"],
			coll: "series",
			init: function(a, b) {
				var c = this,
					d, k = a.series,
					f;
				c.chart = a;
				c.options = b = c.setOptions(b);
				c.linkedSeries = [];
				c.bindAxes();
				h(c, {
					name: b.name,
					state: "",
					visible: !1 !== b.visible,
					selected: !0 === b.selected
				});
				d = b.events;
				H(d, function(a, b) {
					D(c, b, a)
				});
				if (d && d.click || b.point && b.point.events && b.point.events.click || b.allowPointSelect) a.runTrackerClick = !0;
				c.getColor();
				c.getSymbol();
				v(c.parallelArrays, function(a) {
					c[a + "Data"] = []
				});
				c.setData(b.data, !1);
				c.isCartesian && (a.hasCartesianSeries = !0);
				k.length && (f = k[k.length - 1]);
				c._i = J(f && f._i, -1) + 1;
				a.orderSeries(this.insert(k))
			},
			insert: function(a) {
				var c = this.options.index,
					d;
				if (b(c)) {
					for (d = a.length; d--;) if (c >= J(a[d].options.index, a[d]._i)) {
						a.splice(d + 1, 0, this);
						break
					} - 1 === d && a.unshift(this);
					d += 1
				} else a.push(this);
				return J(d, a.length - 1)
			},
			bindAxes: function() {
				var b = this,
					c = b.options,
					d = b.chart,
					f;
				v(b.axisTypes || [], function(k) {
					v(d[k], function(a) {
						f = a.options;
						if (c[k] === f.index || void 0 !== c[k] && c[k] === f.id || void 0 === c[k] && 0 === f.index) b.insert(a.series), b[k] = a, a.isDirty = !0
					});
					b[k] || b.optionalAxis === k || a.error(18, !0)
				})
			},
			updateParallelArrays: function(a, c) {
				var d = a.series,
					f = arguments,
					k = b(c) ?
				function(b) {
					var f = "y" === b && d.toYData ? d.toYData(a) : a[b];
					d[b + "Data"][c] = f
				} : function(a) {
					Array.prototype[c].apply(d[a + "Data"], Array.prototype.slice.call(f, 2))
				};
				v(d.parallelArrays, k)
			},
			autoIncrement: function() {
				var a = this.options,
					b = this.xIncrement,
					c, d = a.pointIntervalUnit,
					b = J(b, a.pointStart, 0);
				this.pointInterval = c = J(this.pointInterval, a.pointInterval, 1);
				d && (a = new l(b), "day" === d ? a = +a[l.hcSetDate](a[l.hcGetDate]() + c) : "month" === d ? a = +a[l.hcSetMonth](a[l.hcGetMonth]() + c) : "year" === d && (a = +a[l.hcSetFullYear](a[l.hcGetFullYear]() + c)), c = a - b);
				this.xIncrement = b + c;
				return b
			},
			setOptions: function(a) {
				var b = this.chart,
					c = b.options,
					d = c.plotOptions,
					f = (b.userOptions || {}).plotOptions || {},
					e = d[this.type];
				this.userOptions = a;
				b = y(e, d.series, a);
				this.tooltipOptions = y(r.tooltip, r.plotOptions.series && r.plotOptions.series.tooltip, r.plotOptions[this.type].tooltip, c.tooltip.userOptions, d.series && d.series.tooltip, d[this.type].tooltip, a.tooltip);
				this.stickyTracking = J(a.stickyTracking, f[this.type] && f[this.type].stickyTracking, f.series && f.series.stickyTracking, this.tooltipOptions.shared && !this.noSharedTooltip ? !0 : b.stickyTracking);
				null === e.marker && delete b.marker;
				this.zoneAxis = b.zoneAxis;
				a = this.zones = (b.zones || []).slice();
				!b.negativeColor && !b.negativeFillColor || b.zones || a.push({
					value: b[this.zoneAxis + "Threshold"] || b.threshold || 0,
					className: "highcharts-negative",
					color: b.negativeColor,
					fillColor: b.negativeFillColor
				});
				a.length && w(a[a.length - 1].value) && a.push({
					color: this.color,
					fillColor: this.fillColor
				});
				return b
			},
			getCyclic: function(a, b, c) {
				var d, f = this.chart,
					e = this.userOptions,
					h = a + "Index",
					q = a + "Counter",
					g = c ? c.length : J(f.options.chart[a + "Count"], f[a + "Count"]);
				b || (d = J(e[h], e["_" + h]), w(d) || (f.series.length || (f[q] = 0), e["_" + h] = d = f[q] % g, f[q] += 1), c && (b = c[d]));
				void 0 !== d && (this[h] = d);
				this[a] = b
			},
			getColor: function() {
				this.options.colorByPoint ? this.options.color = null : this.getCyclic("color", this.options.color || n[this.type].color, this.chart.options.colors)
			},
			getSymbol: function() {
				this.getCyclic("symbol", this.options.marker.symbol, this.chart.options.symbols)
			},
			drawLegendSymbol: a.LegendSymbolMixin.drawLineMarker,
			setData: function(c, e, h, g) {
				var k = this,
					q = k.points,
					m = q && q.length || 0,
					l, t = k.options,
					A = k.chart,
					n = null,
					x = k.xAxis,
					E = t.turboThreshold,
					y = this.xData,
					p = this.yData,
					r = (l = k.pointArrayMap) && l.length;
				c = c || [];
				l = c.length;
				e = J(e, !0);
				if (!1 !== g && l && m === l && !k.cropped && !k.hasGroupedData && k.visible) v(c, function(a, b) {
					q[b].update && a !== t.data[b] && q[b].update(a, !1, null, !1)
				});
				else {
					k.xIncrement = null;
					k.colorCounter = 0;
					v(this.parallelArrays, function(a) {
						k[a + "Data"].length = 0
					});
					if (E && l > E) {
						for (h = 0; null === n && h < l;) n = c[h], h++;
						if (b(n)) for (h = 0; h < l; h++) y[h] = this.autoIncrement(), p[h] = c[h];
						else if (f(n)) if (r) for (h = 0; h < l; h++) n = c[h], y[h] = n[0], p[h] = n.slice(1, r + 1);
						else for (h = 0; h < l; h++) n = c[h], y[h] = n[0], p[h] = n[1];
						else a.error(12)
					} else for (h = 0; h < l; h++) void 0 !== c[h] && (n = {
						series: k
					}, k.pointClass.prototype.applyOptions.apply(n, [c[h]]), k.updateParallelArrays(n, h));
					p && d(p[0]) && a.error(14, !0);
					k.data = [];
					k.options.data = k.userOptions.data = c;
					for (h = m; h--;) q[h] && q[h].destroy && q[h].destroy();
					x && (x.minRange = x.userMinRange);
					k.isDirty = A.isDirtyBox = !0;
					k.isDirtyData = !! q;
					h = !1
				}
				"point" === t.legendType && (this.processData(), this.generatePoints());
				e && A.redraw(h)
			},
			processData: function(b) {
				var c = this.xData,
					d = this.yData,
					f = c.length,
					k;
				k = 0;
				var e, h, q = this.xAxis,
					g, l = this.options;
				g = l.cropThreshold;
				var m = this.getExtremesFromAll || l.getExtremesFromAll,
					n = this.isCartesian,
					l = q && q.val2lin,
					t = q && q.isLog,
					x = this.requireSorting,
					y, p;
				if (n && !this.isDirty && !q.isDirty && !this.yAxis.isDirty && !b) return !1;
				q && (b = q.getExtremes(), y = b.min, p = b.max);
				if (n && this.sorted && !m && (!g || f > g || this.forceCrop)) if (c[f - 1] < y || c[0] > p) c = [], d = [];
				else if (c[0] < y || c[f - 1] > p) k = this.cropData(this.xData, this.yData, y, p), c = k.xData, d = k.yData, k = k.start, e = !0;
				for (g = c.length || 1; --g;) f = t ? l(c[g]) - l(c[g - 1]) : c[g] - c[g - 1], 0 < f && (void 0 === h || f < h) ? h = f : 0 > f && x && (a.error(15), x = !1);
				this.cropped = e;
				this.cropStart = k;
				this.processedXData = c;
				this.processedYData = d;
				this.closestPointRange = h
			},
			cropData: function(a, b, c, d) {
				var f = a.length,
					e = 0,
					h = f,
					g = J(this.cropShoulder, 1),
					q;
				for (q = 0; q < f; q++) if (a[q] >= c) {
					e = Math.max(0, q - g);
					break
				}
				for (c = q; c < f; c++) if (a[c] > d) {
					h = c + g;
					break
				}
				return {
					xData: a.slice(e, h),
					yData: b.slice(e, h),
					start: e,
					end: h
				}
			},
			generatePoints: function() {
				var a = this.options,
					b = a.data,
					c = this.data,
					d, f = this.processedXData,
					e = this.processedYData,
					h = this.pointClass,
					g = f.length,
					l = this.cropStart || 0,
					m, n = this.hasGroupedData,
					a = a.keys,
					t, x = [],
					y;
				c || n || (c = [], c.length = b.length, c = this.data = c);
				a && n && (this.options.keys = !1);
				for (y = 0; y < g; y++) m = l + y, n ? (t = (new h).init(this, [f[y]].concat(K(e[y]))), t.dataGroup = this.groupMap[y]) : (t = c[m]) || void 0 === b[m] || (c[m] = t = (new h).init(this, b[m], f[y])), t && (t.index = m, x[y] = t);
				this.options.keys = a;
				if (c && (g !== (d = c.length) || n)) for (y = 0; y < d; y++) y !== l || n || (y += g), c[y] && (c[y].destroyElements(), c[y].plotX = void 0);
				this.data = c;
				this.points = x
			},
			getExtremes: function(a) {
				var c = this.yAxis,
					d = this.processedXData,
					e, k = [],
					h = 0;
				e = this.xAxis.getExtremes();
				var g = e.min,
					q = e.max,
					l, m, n, t;
				a = a || this.stackedYData || this.processedYData || [];
				e = a.length;
				for (t = 0; t < e; t++) if (m = d[t], n = a[t], l = (b(n, !0) || f(n)) && (!c.positiveValuesOnly || n.length || 0 < n), m = this.getExtremesFromAll || this.options.getExtremesFromAll || this.cropped || (d[t + 1] || m) >= g && (d[t - 1] || m) <= q, l && m) if (l = n.length) for (; l--;) null !== n[l] && (k[h++] = n[l]);
				else k[h++] = n;
				this.dataMin = p(k);
				this.dataMax = G(k)
			},
			translate: function() {
				this.processedXData || this.processData();
				this.generatePoints();
				var a = this.options,
					c = a.stacking,
					d = this.xAxis,
					f = d.categories,
					k = this.yAxis,
					e = this.points,
					h = e.length,
					l = !! this.modifyValue,
					m = a.pointPlacement,
					n = "between" === m || b(m),
					t = a.threshold,
					x = a.startFromThreshold ? t : 0,
					y, p, r, C, v = Number.MAX_VALUE;
				"between" === m && (m = .5);
				b(m) && (m *= J(a.pointRange || d.pointRange));
				for (a = 0; a < h; a++) {
					var K = e[a],
						H = K.x,
						L = K.y;
					p = K.low;
					var B = c && k.stacks[(this.negStacks && L < (x ? 0 : t) ? "-" : "") + this.stackKey],
						D;
					k.positiveValuesOnly && null !== L && 0 >= L && (K.isNull = !0);
					K.plotX = y = g(Math.min(Math.max(-1E5, d.translate(H, 0, 0, 0, 1, m, "flags" === this.type)), 1E5));
					c && this.visible && !K.isNull && B && B[H] && (C = this.getStackIndicator(C, H, this.index), D = B[H], L = D.points[C.key], p = L[0], L = L[1], p === x && C.key === B[H].base && (p = J(t, k.min)), k.positiveValuesOnly && 0 >= p && (p = null), K.total = K.stackTotal = D.total, K.percentage = D.total && K.y / D.total * 100, K.stackY = L, D.setOffset(this.pointXOffset || 0, this.barW || 0));
					K.yBottom = w(p) ? k.translate(p, 0, 1, 0, 1) : null;
					l && (L = this.modifyValue(L, K));
					K.plotY = p = "number" === typeof L && Infinity !== L ? Math.min(Math.max(-1E5, k.translate(L, 0, 1, 0, 1)), 1E5) : void 0;
					K.isInside = void 0 !== p && 0 <= p && p <= k.len && 0 <= y && y <= d.len;
					K.clientX = n ? g(d.translate(H, 0, 0, 0, 1, m)) : y;
					K.negative = K.y < (t || 0);
					K.category = f && void 0 !== f[K.x] ? f[K.x] : K.x;
					K.isNull || (void 0 !== r && (v = Math.min(v, Math.abs(y - r))), r = y);
					K.zone = this.zones.length && K.getZone()
				}
				this.closestPointRangePx = v
			},
			getValidPoints: function(a, b) {
				var d = this.chart;
				return c(a || this.points || [], function(a) {
					return b && !d.isInsidePlot(a.plotX, a.plotY, d.inverted) ? !1 : !a.isNull
				})
			},
			setClip: function(a) {
				var b = this.chart,
					c = this.options,
					d = b.renderer,
					f = b.inverted,
					e = this.clipBox,
					h = e || b.clipBox,
					g = this.sharedClipKey || ["_sharedClip", a && a.duration, a && a.easing, h.height, c.xAxis, c.yAxis].join(),
					q = b[g],
					m = b[g + "m"];
				q || (a && (h.width = 0, f && (h.x = b.plotSizeX), b[g + "m"] = m = d.clipRect(f ? b.plotSizeX + 99 : -99, f ? -b.plotLeft : -b.plotTop, 99, f ? b.chartWidth : b.chartHeight)), b[g] = q = d.clipRect(h), q.count = {
					length: 0
				});
				a && !q.count[this.index] && (q.count[this.index] = !0, q.count.length += 1);
				!1 !== c.clip && (this.group.clip(a || e ? q : b.clipRect), this.markerGroup.clip(m), this.sharedClipKey = g);
				a || (q.count[this.index] && (delete q.count[this.index], --q.count.length), 0 === q.count.length && g && b[g] && (e || (b[g] = b[g].destroy()), b[g + "m"] && (b[g + "m"] = b[g + "m"].destroy())))
			},
			animate: function(a) {
				var b = this.chart,
					c = B(this.options.animation),
					d;
				a ? this.setClip(c) : (d = this.sharedClipKey, (a = b[d]) && a.animate({
					width: b.plotSizeX,
					x: 0
				}, c), b[d + "m"] && b[d + "m"].animate({
					width: b.plotSizeX + 99,
					x: 0
				}, c), this.animate = null)
			},
			afterAnimate: function() {
				this.setClip();
				m(this, "afterAnimate");
				this.finishedAnimating = !0
			},
			drawPoints: function() {
				var a = this.points,
					b = this.chart,
					c, d, f, e, h = this.options.marker,
					g, m, l, n = this[this.specialGroup] || this.markerGroup,
					t, x = J(h.enabled, this.xAxis.isRadial ? !0 : null, this.closestPointRangePx >= 2 * h.radius);
				if (!1 !== h.enabled || this._hasPointMarkers) for (c = 0; c < a.length; c++) d = a[c], e = d.graphic, g = d.marker || {}, m = !! d.marker, f = x && void 0 === g.enabled || g.enabled, l = d.isInside, f && !d.isNull ? (f = J(g.symbol, this.symbol), d.hasImage = 0 === f.indexOf("url"), t = this.markerAttribs(d, d.selected && "select"), e ? e[l ? "show" : "hide"](!0).animate(t) : l && (0 < t.width || d.hasImage) && (d.graphic = e = b.renderer.symbol(f, t.x, t.y, t.width, t.height, m ? g : h).add(n)), e && e.attr(this.pointAttribs(d, d.selected && "select")), e && e.addClass(d.getClassName(), !0)) : e && (d.graphic = e.destroy())
			},
			markerAttribs: function(a, b) {
				var c = this.options.marker,
					d = a.marker || {},
					f = J(d.radius, c.radius);
				b && (c = c.states[b], b = d.states && d.states[b], f = J(b && b.radius, c && c.radius, f + (c && c.radiusPlus || 0)));
				a.hasImage && (f = 0);
				a = {
					x: Math.floor(a.plotX) - f,
					y: a.plotY - f
				};
				f && (a.width = a.height = 2 * f);
				return a
			},
			pointAttribs: function(a, b) {
				var c = this.options.marker,
					d = a && a.options,
					f = d && d.marker || {},
					e = this.color,
					h = d && d.color,
					g = a && a.color,
					d = J(f.lineWidth, c.lineWidth);
				a = a && a.zone && a.zone.color;
				e = h || a || g || e;
				a = f.fillColor || c.fillColor || e;
				e = f.lineColor || c.lineColor || e;
				b && (c = c.states[b], b = f.states && f.states[b] || {}, d = J(b.lineWidth, c.lineWidth, d + J(b.lineWidthPlus, c.lineWidthPlus, 0)), a = b.fillColor || c.fillColor || a, e = b.lineColor || c.lineColor || e);
				return {
					stroke: e,
					"stroke-width": d,
					fill: a
				}
			},
			destroy: function() {
				var a = this,
					b = a.chart,
					c = /AppleWebKit\/533/.test(L.navigator.userAgent),
					d, f, h = a.data || [],
					g, l;
				m(a, "destroy");
				t(a);
				v(a.axisTypes || [], function(b) {
					(l = a[b]) && l.series && (e(l.series, a), l.isDirty = l.forceRedraw = !0)
				});
				a.legendItem && a.chart.legend.destroyItem(a);
				for (f = h.length; f--;)(g = h[f]) && g.destroy && g.destroy();
				a.points = null;
				clearTimeout(a.animationTimeout);
				H(a, function(a, b) {
					a instanceof x && !a.survive && (d = c && "group" === b ? "hide" : "destroy", a[d]())
				});
				b.hoverSeries === a && (b.hoverSeries = null);
				e(b.series, a);
				b.orderSeries();
				H(a, function(b, c) {
					delete a[c]
				})
			},
			getGraphPath: function(a, b, c) {
				var d = this,
					f = d.options,
					e = f.step,
					h, g = [],
					m = [],
					l;
				a = a || d.points;
				(h = a.reversed) && a.reverse();
				(e = {
					right: 1,
					center: 2
				}[e] || e && 3) && h && (e = 4 - e);
				!f.connectNulls || b || c || (a = this.getValidPoints(a));
				v(a, function(k, h) {
					var q = k.plotX,
						t = k.plotY,
						n = a[h - 1];
					(k.leftCliff || n && n.rightCliff) && !c && (l = !0);
					k.isNull && !w(b) && 0 < h ? l = !f.connectNulls : k.isNull && !b ? l = !0 : (0 === h || l ? h = ["M", k.plotX, k.plotY] : d.getPointSpline ? h = d.getPointSpline(a, k, h) : e ? (h = 1 === e ? ["L", n.plotX, t] : 2 === e ? ["L", (n.plotX + q) / 2, n.plotY, "L", (n.plotX + q) / 2, t] : ["L", q, n.plotY], h.push("L", q, t)) : h = ["L", q, t], m.push(k.x), e && m.push(k.x), g.push.apply(g, h), l = !1)
				});
				g.xMap = m;
				return d.graphPath = g
			},
			drawGraph: function() {
				var a = this,
					b = this.options,
					c = (this.gappedPath || this.getGraphPath).call(this),
					d = [
						["graph", "highcharts-graph", b.lineColor || this.color, b.dashStyle]
					];
				v(this.zones, function(c, f) {
					d.push(["zone-graph-" + f, "highcharts-graph highcharts-zone-graph-" + f + " " + (c.className || ""), c.color || a.color, c.dashStyle || b.dashStyle])
				});
				v(d, function(d, f) {
					var e = d[0],
						k = a[e];
					k ? (k.endX = a.preventGraphAnimation ? null : c.xMap, k.animate({
						d: c
					})) : c.length && (a[e] = a.chart.renderer.path(c).addClass(d[1]).attr({
						zIndex: 1
					}).add(a.group), k = {
						stroke: d[2],
						"stroke-width": b.lineWidth,
						fill: a.fillGraph && a.color || "none"
					}, d[3] ? k.dashstyle = d[3] : "square" !== b.linecap && (k["stroke-linecap"] = k["stroke-linejoin"] = "round"), k = a[e].attr(k).shadow(2 > f && b.shadow));
					k && (k.startX = c.xMap, k.isArea = c.isArea)
				})
			},
			applyZones: function() {
				var a = this,
					b = this.chart,
					c = b.renderer,
					d = this.zones,
					f, e, h = this.clips || [],
					g, l = this.graph,
					m = this.area,
					t = Math.max(b.chartWidth, b.chartHeight),
					n = this[(this.zoneAxis || "y") + "Axis"],
					x, y, p = b.inverted,
					r, C, w, K, L = !1;
				d.length && (l || m) && n && void 0 !== n.min && (y = n.reversed, r = n.horiz, l && l.hide(), m && m.hide(), x = n.getExtremes(), v(d, function(d, k) {
					f = y ? r ? b.plotWidth : 0 : r ? 0 : n.toPixels(x.min);
					f = Math.min(Math.max(J(e, f), 0), t);
					e = Math.min(Math.max(Math.round(n.toPixels(J(d.value, x.max), !0)), 0), t);
					L && (f = e = n.toPixels(x.max));
					C = Math.abs(f - e);
					w = Math.min(f, e);
					K = Math.max(f, e);
					n.isXAxis ? (g = {
						x: p ? K : w,
						y: 0,
						width: C,
						height: t
					}, r || (g.x = b.plotHeight - g.x)) : (g = {
						x: 0,
						y: p ? K : w,
						width: t,
						height: C
					}, r && (g.y = b.plotWidth - g.y));
					p && c.isVML && (g = n.isXAxis ? {
						x: 0,
						y: y ? w : K,
						height: g.width,
						width: b.chartWidth
					} : {
						x: g.y - b.plotLeft - b.spacingBox.x,
						y: 0,
						width: g.height,
						height: b.chartHeight
					});
					h[k] ? h[k].animate(g) : (h[k] = c.clipRect(g), l && a["zone-graph-" + k].clip(h[k]), m && a["zone-area-" + k].clip(h[k]));
					L = d.value > x.max
				}), this.clips = h)
			},
			invertGroups: function(a) {
				function b() {
					v(["group", "markerGroup"], function(b) {
						c[b] && (d.renderer.isVML && c[b].attr({
							width: c.yAxis.len,
							height: c.xAxis.len
						}), c[b].width = c.yAxis.len, c[b].height = c.xAxis.len, c[b].invert(a))
					})
				}
				var c = this,
					d = c.chart,
					f;
				c.xAxis && (f = D(d, "resize", b), D(c, "destroy", f), b(a), c.invertGroups = b)
			},
			plotGroup: function(a, b, c, d, f) {
				var e = this[a],
					k = !e;
				k && (this[a] = e = this.chart.renderer.g().attr({
					zIndex: d || .1
				}).add(f));
				e.addClass("highcharts-" + b + " highcharts-series-" + this.index + " highcharts-" + this.type + "-series " + (w(this.colorIndex) ? "highcharts-color-" + this.colorIndex + " " : "") + (this.options.className || "") + (e.hasClass("highcharts-tracker") ? " highcharts-tracker" : ""), !0);
				e.attr({
					visibility: c
				})[k ? "attr" : "animate"](this.getPlotBox());
				return e
			},
			getPlotBox: function() {
				var a = this.chart,
					b = this.xAxis,
					c = this.yAxis;
				a.inverted && (b = c, c = this.xAxis);
				return {
					translateX: b ? b.left : a.plotLeft,
					translateY: c ? c.top : a.plotTop,
					scaleX: 1,
					scaleY: 1
				}
			},
			render: function() {
				var a = this,
					b = a.chart,
					c, d = a.options,
					f = !! a.animate && b.renderer.isSVG && B(d.animation).duration,
					e = a.visible ? "inherit" : "hidden",
					h = d.zIndex,
					g = a.hasRendered,
					l = b.seriesGroup,
					m = b.inverted;
				c = a.plotGroup("group", "series", e, h, l);
				a.markerGroup = a.plotGroup("markerGroup", "markers", e, h, l);
				f && a.animate(!0);
				c.inverted = a.isCartesian ? m : !1;
				a.drawGraph && (a.drawGraph(), a.applyZones());
				a.drawDataLabels && a.drawDataLabels();
				a.visible && a.drawPoints();
				a.drawTracker && !1 !== a.options.enableMouseTracking && a.drawTracker();
				a.invertGroups(m);
				!1 === d.clip || a.sharedClipKey || g || c.clip(b.clipRect);
				f && a.animate();
				g || (a.animationTimeout = C(function() {
					a.afterAnimate()
				}, f));
				a.isDirty = !1;
				a.hasRendered = !0
			},
			redraw: function() {
				var a = this.chart,
					b = this.isDirty || this.isDirtyData,
					c = this.group,
					d = this.xAxis,
					f = this.yAxis;
				c && (a.inverted && c.attr({
					width: a.plotWidth,
					height: a.plotHeight
				}), c.animate({
					translateX: J(d && d.left, a.plotLeft),
					translateY: J(f && f.top, a.plotTop)
				}));
				this.translate();
				this.render();
				b && delete this.kdTree
			},
			kdAxisArray: ["clientX", "plotY"],
			searchPoint: function(a, b) {
				var c = this.xAxis,
					d = this.yAxis,
					f = this.chart.inverted;
				return this.searchKDTree({
					clientX: f ? c.len - a.chartY + c.pos : a.chartX - c.pos,
					plotY: f ? d.len - a.chartX + d.pos : a.chartY - d.pos
				}, b)
			},
			buildKDTree: function() {
				function a(c, d, f) {
					var e, k;
					if (k = c && c.length) return e = b.kdAxisArray[d % f], c.sort(function(a, b) {
						return a[e] - b[e]
					}), k = Math.floor(k / 2), {
						point: c[k],
						left: a(c.slice(0, k), d + 1, f),
						right: a(c.slice(k + 1), d + 1, f)
					}
				}
				this.buildingKdTree = !0;
				var b = this,
					c = -1 < b.options.findNearestPointBy.indexOf("y") ? 2 : 1;
				delete b.kdTree;
				C(function() {
					b.kdTree = a(b.getValidPoints(null, !b.directTouch), c, c);
					b.buildingKdTree = !1
				}, b.options.kdNow ? 0 : 1)
			},
			searchKDTree: function(a, b) {
				function c(a, b, k, g) {
					var l = b.point,
						m = d.kdAxisArray[k % g],
						q, n, t = l;
					n = w(a[f]) && w(l[f]) ? Math.pow(a[f] - l[f], 2) : null;
					q = w(a[e]) && w(l[e]) ? Math.pow(a[e] - l[e], 2) : null;
					q = (n || 0) + (q || 0);
					l.dist = w(q) ? Math.sqrt(q) : Number.MAX_VALUE;
					l.distX = w(n) ? Math.sqrt(n) : Number.MAX_VALUE;
					m = a[m] - l[m];
					q = 0 > m ? "left" : "right";
					n = 0 > m ? "right" : "left";
					b[q] && (q = c(a, b[q], k + 1, g), t = q[h] < t[h] ? q : l);
					b[n] && Math.sqrt(m * m) < t[h] && (a = c(a, b[n], k + 1, g), t = a[h] < t[h] ? a : t);
					return t
				}
				var d = this,
					f = this.kdAxisArray[0],
					e = this.kdAxisArray[1],
					h = b ? "distX" : "dist";
				b = -1 < d.options.findNearestPointBy.indexOf("y") ? 2 : 1;
				this.kdTree || this.buildingKdTree || this.buildKDTree();
				if (this.kdTree) return c(a, this.kdTree, b, b)
			}
		})
	})(N);
	(function(a) {
		var D = a.Axis,
			B = a.Chart,
			G = a.correctFloat,
			p = a.defined,
			g = a.destroyObjectProperties,
			l = a.each,
			r = a.format,
			n = a.objectEach,
			w = a.pick,
			v = a.Series;
		a.StackItem = function(a, h, g, c, f) {
			var b = a.chart.inverted;
			this.axis = a;
			this.isNegative = g;
			this.options = h;
			this.x = c;
			this.total = null;
			this.points = {};
			this.stack = f;
			this.rightCliff = this.leftCliff = 0;
			this.alignOptions = {
				align: h.align || (b ? g ? "left" : "right" : "center"),
				verticalAlign: h.verticalAlign || (b ? "middle" : g ? "bottom" : "top"),
				y: w(h.y, b ? 4 : g ? 14 : -6),
				x: w(h.x, b ? g ? -6 : 6 : 0)
			};
			this.textAlign = h.textAlign || (b ? g ? "right" : "left" : "center")
		};
		a.StackItem.prototype = {
			destroy: function() {
				g(this, this.axis)
			},
			render: function(a) {
				var e = this.options,
					g = e.format,
					g = g ? r(g, this) : e.formatter.call(this);
				this.label ? this.label.attr({
					text: g,
					visibility: "hidden"
				}) : this.label = this.axis.chart.renderer.text(g, null, null, e.useHTML).css(e.style).attr({
					align: this.textAlign,
					rotation: e.rotation,
					visibility: "hidden"
				}).add(a)
			},
			setOffset: function(a, h) {
				var e = this.axis,
					c = e.chart,
					f = e.translate(e.usePercentage ? 100 : this.total, 0, 0, 0, 1),
					e = e.translate(0),
					e = Math.abs(f - e);
				a = c.xAxis[0].translate(this.x) + a;
				f = this.getStackBox(c, this, a, f, h, e);
				if (h = this.label) h.align(this.alignOptions, null, f), f = h.alignAttr, h[!1 === this.options.crop || c.isInsidePlot(f.x, f.y) ? "show" : "hide"](!0)
			},
			getStackBox: function(a, h, g, c, f, b) {
				var d = h.axis.reversed,
					e = a.inverted;
				a = a.plotHeight;
				h = h.isNegative && !d || !h.isNegative && d;
				return {
					x: e ? h ? c : c - b : g,
					y: e ? a - g - f : h ? a - c - b : a - c,
					width: e ? b : f,
					height: e ? f : b
				}
			}
		};
		B.prototype.getStacks = function() {
			var a = this;
			l(a.yAxis, function(a) {
				a.stacks && a.hasVisibleSeries && (a.oldStacks = a.stacks)
			});
			l(a.series, function(e) {
				!e.options.stacking || !0 !== e.visible && !1 !== a.options.chart.ignoreHiddenSeries || (e.stackKey = e.type + w(e.options.stack, ""))
			})
		};
		D.prototype.buildStacks = function() {
			var a = this.series,
				h = w(this.options.reversedStacks, !0),
				g = a.length,
				c;
			if (!this.isXAxis) {
				this.usePercentage = !1;
				for (c = g; c--;) a[h ? c : g - c - 1].setStackedPoints();
				for (c = 0; c < g; c++) a[c].modifyStacks()
			}
		};
		D.prototype.renderStackTotals = function() {
			var a = this.chart,
				h = a.renderer,
				g = this.stacks,
				c = this.stackTotalGroup;
			c || (this.stackTotalGroup = c = h.g("stack-labels").attr({
				visibility: "visible",
				zIndex: 6
			}).add());
			c.translate(a.plotLeft, a.plotTop);
			n(g, function(a) {
				n(a, function(a) {
					a.render(c)
				})
			})
		};
		D.prototype.resetStacks = function() {
			var a = this,
				h = a.stacks;
			a.isXAxis || n(h, function(e) {
				n(e, function(c, f) {
					c.touched < a.stacksTouched ? (c.destroy(), delete e[f]) : (c.total = null, c.cum = null)
				})
			})
		};
		D.prototype.cleanStacks = function() {
			var a;
			this.isXAxis || (this.oldStacks && (a = this.stacks = this.oldStacks), n(a, function(a) {
				n(a, function(a) {
					a.cum = a.total
				})
			}))
		};
		v.prototype.setStackedPoints = function() {
			if (this.options.stacking && (!0 === this.visible || !1 === this.chart.options.chart.ignoreHiddenSeries)) {
				var e = this.processedXData,
					h = this.processedYData,
					g = [],
					c = h.length,
					f = this.options,
					b = f.threshold,
					d = f.startFromThreshold ? b : 0,
					l = f.stack,
					f = f.stacking,
					n = this.stackKey,
					r = "-" + n,
					t = this.negStacks,
					v = this.yAxis,
					x = v.stacks,
					C = v.oldStacks,
					L, q, A, E, F, k, u;
				v.stacksTouched += 1;
				for (F = 0; F < c; F++) k = e[F], u = h[F], L = this.getStackIndicator(L, k, this.index), E = L.key, A = (q = t && u < (d ? 0 : b)) ? r : n, x[A] || (x[A] = {}), x[A][k] || (C[A] && C[A][k] ? (x[A][k] = C[A][k], x[A][k].total = null) : x[A][k] = new a.StackItem(v, v.options.stackLabels, q, k, l)), A = x[A][k], null !== u && (A.points[E] = A.points[this.index] = [w(A.cum, d)], p(A.cum) || (A.base = E), A.touched = v.stacksTouched, 0 < L.index && !1 === this.singleStacks && (A.points[E][0] = A.points[this.index + "," + k + ",0"][0])), "percent" === f ? (q = q ? n : r, t && x[q] && x[q][k] ? (q = x[q][k], A.total = q.total = Math.max(q.total, A.total) + Math.abs(u) || 0) : A.total = G(A.total + (Math.abs(u) || 0))) : A.total = G(A.total + (u || 0)), A.cum = w(A.cum, d) + (u || 0), null !== u && (A.points[E].push(A.cum), g[F] = A.cum);
				"percent" === f && (v.usePercentage = !0);
				this.stackedYData = g;
				v.oldStacks = {}
			}
		};
		v.prototype.modifyStacks = function() {
			var a = this,
				h = a.stackKey,
				g = a.yAxis.stacks,
				c = a.processedXData,
				f, b = a.options.stacking;
			a[b + "Stacker"] && l([h, "-" + h], function(d) {
				for (var e = c.length, h, l; e--;) if (h = c[e], f = a.getStackIndicator(f, h, a.index, d), l = (h = g[d] && g[d][h]) && h.points[f.key]) a[b + "Stacker"](l, h, e)
			})
		};
		v.prototype.percentStacker = function(a, h, g) {
			h = h.total ? 100 / h.total : 0;
			a[0] = G(a[0] * h);
			a[1] = G(a[1] * h);
			this.stackedYData[g] = a[1]
		};
		v.prototype.getStackIndicator = function(a, h, g, c) {
			!p(a) || a.x !== h || c && a.key !== c ? a = {
				x: h,
				index: 0,
				key: c
			} : a.index++;
			a.key = [g, h, a.index].join();
			return a
		}
	})(N);
	(function(a) {
		var D = a.addEvent,
			B = a.animate,
			G = a.Axis,
			p = a.createElement,
			g = a.css,
			l = a.defined,
			r = a.each,
			n = a.erase,
			w = a.extend,
			v = a.fireEvent,
			e = a.inArray,
			h = a.isNumber,
			m = a.isObject,
			c = a.isArray,
			f = a.merge,
			b = a.objectEach,
			d = a.pick,
			y = a.Point,
			H = a.Series,
			J = a.seriesTypes,
			t = a.setAnimation,
			K = a.splat;
		w(a.Chart.prototype, {
			addSeries: function(a, b, c) {
				var f, e = this;
				a && (b = d(b, !0), v(e, "addSeries", {
					options: a
				}, function() {
					f = e.initSeries(a);
					e.isDirtyLegend = !0;
					e.linkSeries();
					b && e.redraw(c)
				}));
				return f
			},
			addAxis: function(a, b, c, e) {
				var h = b ? "xAxis" : "yAxis",
					g = this.options;
				a = f(a, {
					index: this[h].length,
					isX: b
				});
				b = new G(this, a);
				g[h] = K(g[h] || {});
				g[h].push(a);
				d(c, !0) && this.redraw(e);
				return b
			},
			showLoading: function(a) {
				var b = this,
					c = b.options,
					d = b.loadingDiv,
					f = c.loading,
					e = function() {
						d && g(d, {
							left: b.plotLeft + "px",
							top: b.plotTop + "px",
							width: b.plotWidth + "px",
							height: b.plotHeight + "px"
						})
					};
				d || (b.loadingDiv = d = p("div", {
					className: "highcharts-loading highcharts-loading-hidden"
				}, null, b.container), b.loadingSpan = p("span", {
					className: "highcharts-loading-inner"
				}, null, d), D(b, "redraw", e));
				d.className = "highcharts-loading";
				b.loadingSpan.innerHTML = a || c.lang.loading;
				g(d, w(f.style, {
					zIndex: 10
				}));
				g(b.loadingSpan, f.labelStyle);
				b.loadingShown || (g(d, {
					opacity: 0,
					display: ""
				}), B(d, {
					opacity: f.style.opacity || .5
				}, {
					duration: f.showDuration || 0
				}));
				b.loadingShown = !0;
				e()
			},
			hideLoading: function() {
				var a = this.options,
					b = this.loadingDiv;
				b && (b.className = "highcharts-loading highcharts-loading-hidden", B(b, {
					opacity: 0
				}, {
					duration: a.loading.hideDuration || 100,
					complete: function() {
						g(b, {
							display: "none"
						})
					}
				}));
				this.loadingShown = !1
			},
			propsRequireDirtyBox: "backgroundColor borderColor borderWidth margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "),
			propsRequireUpdateSeries: "chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions tooltip".split(" "),
			update: function(a, c, g) {
				var m = this,
					n = {
						credits: "addCredits",
						title: "setTitle",
						subtitle: "setSubtitle"
					},
					t = a.chart,
					x, k, y = [];
				if (t) {
					f(!0, m.options.chart, t);
					"className" in t && m.setClassName(t.className);
					if ("inverted" in t || "polar" in t) m.propFromSeries(), x = !0;
					"alignTicks" in t && (x = !0);
					b(t, function(a, b) {
						-1 !== e("chart." + b, m.propsRequireUpdateSeries) && (k = !0); - 1 !== e(b, m.propsRequireDirtyBox) && (m.isDirtyBox = !0)
					});
					"style" in t && m.renderer.setStyle(t.style)
				}
				a.colors && (this.options.colors = a.colors);
				a.plotOptions && f(!0, this.options.plotOptions, a.plotOptions);
				b(a, function(a, b) {
					if (m[b] && "function" === typeof m[b].update) m[b].update(a, !1);
					else if ("function" === typeof m[n[b]]) m[n[b]](a);
					"chart" !== b && -1 !== e(b, m.propsRequireUpdateSeries) && (k = !0)
				});
				r("xAxis yAxis zAxis series colorAxis pane".split(" "), function(b) {
					a[b] && (r(K(a[b]), function(a, c) {
						(c = l(a.id) && m.get(a.id) || m[b][c]) && c.coll === b && (c.update(a, !1), g && (c.touched = !0));
						if (!c && g) if ("series" === b) m.addSeries(a, !1).touched = !0;
						else if ("xAxis" === b || "yAxis" === b) m.addAxis(a, "xAxis" === b, !1).touched = !0
					}), g && r(m[b], function(a) {
						a.touched ? delete a.touched : y.push(a)
					}))
				});
				r(y, function(a) {
					a.remove(!1)
				});
				x && r(m.axes, function(a) {
					a.update({}, !1)
				});
				k && r(m.series, function(a) {
					a.update({}, !1)
				});
				a.loading && f(!0, m.options.loading, a.loading);
				x = t && t.width;
				t = t && t.height;
				h(x) && x !== m.chartWidth || h(t) && t !== m.chartHeight ? m.setSize(x, t) : d(c, !0) && m.redraw()
			},
			setSubtitle: function(a) {
				this.setTitle(void 0, a)
			}
		});
		w(y.prototype, {
			update: function(a, b, c, f) {
				function e() {
					h.applyOptions(a);
					null === h.y && k && (h.graphic = k.destroy());
					m(a, !0) && (k && k.element && a && a.marker && void 0 !== a.marker.symbol && (h.graphic = k.destroy()), a && a.dataLabels && h.dataLabel && (h.dataLabel = h.dataLabel.destroy()), h.connector && (h.connector = h.connector.destroy()));
					l = h.index;
					g.updateParallelArrays(h, l);
					n.data[l] = m(n.data[l], !0) || m(a, !0) ? h.options : a;
					g.isDirty = g.isDirtyData = !0;
					!g.fixedBox && g.hasCartesianSeries && (t.isDirtyBox = !0);
					"point" === n.legendType && (t.isDirtyLegend = !0);
					b && t.redraw(c)
				}
				var h = this,
					g = h.series,
					k = h.graphic,
					l, t = g.chart,
					n = g.options;
				b = d(b, !0);
				!1 === f ? e() : h.firePointEvent("update", {
					options: a
				}, e)
			},
			remove: function(a, b) {
				this.series.removePoint(e(this, this.series.data), a, b)
			}
		});
		w(H.prototype, {
			addPoint: function(a, b, c, f) {
				var e = this.options,
					h = this.data,
					g = this.chart,
					k = this.xAxis,
					k = k && k.hasNames && k.names,
					l = e.data,
					m, t, n = this.xData,
					q, x;
				b = d(b, !0);
				m = {
					series: this
				};
				this.pointClass.prototype.applyOptions.apply(m, [a]);
				x = m.x;
				q = n.length;
				if (this.requireSorting && x < n[q - 1]) for (t = !0; q && n[q - 1] > x;) q--;
				this.updateParallelArrays(m, "splice", q, 0, 0);
				this.updateParallelArrays(m, q);
				k && m.name && (k[x] = m.name);
				l.splice(q, 0, a);
				t && (this.data.splice(q, 0, null), this.processData());
				"point" === e.legendType && this.generatePoints();
				c && (h[0] && h[0].remove ? h[0].remove(!1) : (h.shift(), this.updateParallelArrays(m, "shift"), l.shift()));
				this.isDirtyData = this.isDirty = !0;
				b && g.redraw(f)
			},
			removePoint: function(a, b, c) {
				var f = this,
					e = f.data,
					h = e[a],
					g = f.points,
					k = f.chart,
					l = function() {
						g && g.length === e.length && g.splice(a, 1);
						e.splice(a, 1);
						f.options.data.splice(a, 1);
						f.updateParallelArrays(h || {
							series: f
						}, "splice", a, 1);
						h && h.destroy();
						f.isDirty = !0;
						f.isDirtyData = !0;
						b && k.redraw()
					};
				t(c, k);
				b = d(b, !0);
				h ? h.firePointEvent("remove", null, l) : l()
			},
			remove: function(a, b, c) {
				function f() {
					e.destroy();
					h.isDirtyLegend = h.isDirtyBox = !0;
					h.linkSeries();
					d(a, !0) && h.redraw(b)
				}
				var e = this,
					h = e.chart;
				!1 !== c ? v(e, "remove", null, f) : f()
			},
			update: function(a, b) {
				var c = this,
					e = c.chart,
					h = c.userOptions,
					g = c.oldType || c.type,
					l = a.type || h.type || e.options.chart.type,
					k = J[g].prototype,
					m, t = ["group", "markerGroup", "dataLabelsGroup"],
					n = ["navigatorSeries", "baseSeries"],
					y = c.finishedAnimating && {
						animation: !1
					};
				if (Object.keys && "data" === Object.keys(a).toString()) return this.setData(a.data, b);
				if (l && l !== g || void 0 !== a.zIndex) t.length = 0;
				n = t.concat(n);
				r(n, function(a) {
					n[a] = c[a];
					delete c[a]
				});
				a = f(h, y, {
					index: c.index,
					pointStart: c.xData[0]
				}, {
					data: c.options.data
				}, a);
				c.remove(!1, null, !1);
				for (m in k) c[m] = void 0;
				w(c, J[l || g].prototype);
				r(n, function(a) {
					c[a] = n[a]
				});
				c.init(e, a);
				c.oldType = g;
				e.linkSeries();
				d(b, !0) && e.redraw(!1)
			}
		});
		w(G.prototype, {
			update: function(a, b) {
				var c = this.chart;
				a = c.options[this.coll][this.options.index] = f(this.userOptions, a);
				this.destroy(!0);
				this.init(c, w(a, {
					events: void 0
				}));
				c.isDirtyBox = !0;
				d(b, !0) && c.redraw()
			},
			remove: function(a) {
				for (var b = this.chart, f = this.coll, e = this.series, h = e.length; h--;) e[h] && e[h].remove(!1);
				n(b.axes, this);
				n(b[f], this);
				c(b.options[f]) ? b.options[f].splice(this.options.index, 1) : delete b.options[f];
				r(b[f], function(a, b) {
					a.options.index = b
				});
				this.destroy();
				b.isDirtyBox = !0;
				d(a, !0) && b.redraw()
			},
			setTitle: function(a, b) {
				this.update({
					title: a
				}, b)
			},
			setCategories: function(a, b) {
				this.update({
					categories: a
				}, b)
			}
		})
	})(N);
	(function(a) {
		var D = a.color,
			B = a.each,
			G = a.map,
			p = a.pick,
			g = a.Series,
			l = a.seriesType;
		l("area", "line", {
			softThreshold: !1,
			threshold: 0
		}, {
			singleStacks: !1,
			getStackPoints: function(g) {
				var l = [],
					r = [],
					v = this.xAxis,
					e = this.yAxis,
					h = e.stacks[this.stackKey],
					m = {},
					c = this.index,
					f = e.series,
					b = f.length,
					d, y = p(e.options.reversedStacks, !0) ? 1 : -1,
					H;
				g = g || this.points;
				if (this.options.stacking) {
					for (H = 0; H < g.length; H++) g[H].leftNull = g[H].rightNull = null, m[g[H].x] = g[H];
					a.objectEach(h, function(a, b) {
						null !== a.total && r.push(b)
					});
					r.sort(function(a, b) {
						return a - b
					});
					d = G(f, function() {
						return this.visible
					});
					B(r, function(a, f) {
						var g = 0,
							n, t;
						if (m[a] && !m[a].isNull) l.push(m[a]), B([-1, 1], function(e) {
							var g = 1 === e ? "rightNull" : "leftNull",
								l = 0,
								p = h[r[f + e]];
							if (p) for (H = c; 0 <= H && H < b;) n = p.points[H], n || (H === c ? m[a][g] = !0 : d[H] && (t = h[a].points[H]) && (l -= t[1] - t[0])), H += y;
							m[a][1 === e ? "rightCliff" : "leftCliff"] = l
						});
						else {
							for (H = c; 0 <= H && H < b;) {
								if (n = h[a].points[H]) {
									g = n[1];
									break
								}
								H += y
							}
							g = e.translate(g, 0, 1, 0, 1);
							l.push({
								isNull: !0,
								plotX: v.translate(a, 0, 0, 0, 1),
								x: a,
								plotY: g,
								yBottom: g
							})
						}
					})
				}
				return l
			},
			getGraphPath: function(a) {
				var l = g.prototype.getGraphPath,
					r = this.options,
					v = r.stacking,
					e = this.yAxis,
					h, m, c = [],
					f = [],
					b = this.index,
					d, y = e.stacks[this.stackKey],
					H = r.threshold,
					J = e.getThreshold(r.threshold),
					t, r = r.connectNulls || "percent" === v,
					K = function(h, g, l) {
						var m = a[h];
						h = v && y[m.x].points[b];
						var t = m[l + "Null"] || 0;
						l = m[l + "Cliff"] || 0;
						var n, p, m = !0;
						l || t ? (n = (t ? h[0] : h[1]) + l, p = h[0] + l, m = !! t) : !v && a[g] && a[g].isNull && (n = p = H);
						void 0 !== n && (f.push({
							plotX: d,
							plotY: null === n ? J : e.getThreshold(n),
							isNull: m,
							isCliff: !0
						}), c.push({
							plotX: d,
							plotY: null === p ? J : e.getThreshold(p),
							doCurve: !1
						}))
					};
				a = a || this.points;
				v && (a = this.getStackPoints(a));
				for (h = 0; h < a.length; h++) if (m = a[h].isNull, d = p(a[h].rectPlotX, a[h].plotX), t = p(a[h].yBottom, J), !m || r) r || K(h, h - 1, "left"), m && !v && r || (f.push(a[h]), c.push({
					x: h,
					plotX: d,
					plotY: t
				})), r || K(h, h + 1, "right");
				h = l.call(this, f, !0, !0);
				c.reversed = !0;
				m = l.call(this, c, !0, !0);
				m.length && (m[0] = "L");
				m = h.concat(m);
				l = l.call(this, f, !1, r);
				m.xMap = h.xMap;
				this.areaPath = m;
				return l
			},
			drawGraph: function() {
				this.areaPath = [];
				g.prototype.drawGraph.apply(this);
				var a = this,
					l = this.areaPath,
					w = this.options,
					v = [
						["area", "highcharts-area", this.color, w.fillColor]
					];
				B(this.zones, function(e, h) {
					v.push(["zone-area-" + h, "highcharts-area highcharts-zone-area-" + h + " " + e.className, e.color || a.color, e.fillColor || w.fillColor])
				});
				B(v, function(e) {
					var h = e[0],
						g = a[h];
					g ? (g.endX = a.preventGraphAnimation ? null : l.xMap, g.animate({
						d: l
					})) : (g = a[h] = a.chart.renderer.path(l).addClass(e[1]).attr({
						fill: p(e[3], D(e[2]).setOpacity(p(w.fillOpacity, .75)).get()),
						zIndex: 0
					}).add(a.group), g.isArea = !0);
					g.startX = l.xMap;
					g.shiftUnit = w.step ? 2 : 1
				})
			},
			drawLegendSymbol: a.LegendSymbolMixin.drawRectangle
		})
	})(N);
	(function(a) {
		var D = a.pick;
		a = a.seriesType;
		a("spline", "line", {}, {
			getPointSpline: function(a, G, p) {
				var g = G.plotX,
					l = G.plotY,
					r = a[p - 1];
				p = a[p + 1];
				var n, w, v, e;
				if (r && !r.isNull && !1 !== r.doCurve && !G.isCliff && p && !p.isNull && !1 !== p.doCurve && !G.isCliff) {
					a = r.plotY;
					v = p.plotX;
					p = p.plotY;
					var h = 0;
					n = (1.5 * g + r.plotX) / 2.5;
					w = (1.5 * l + a) / 2.5;
					v = (1.5 * g + v) / 2.5;
					e = (1.5 * l + p) / 2.5;
					v !== n && (h = (e - w) * (v - g) / (v - n) + l - e);
					w += h;
					e += h;
					w > a && w > l ? (w = Math.max(a, l), e = 2 * l - w) : w < a && w < l && (w = Math.min(a, l), e = 2 * l - w);
					e > p && e > l ? (e = Math.max(p, l), w = 2 * l - e) : e < p && e < l && (e = Math.min(p, l), w = 2 * l - e);
					G.rightContX = v;
					G.rightContY = e
				}
				G = ["C", D(r.rightContX, r.plotX), D(r.rightContY, r.plotY), D(n, g), D(w, l), g, l];
				r.rightContX = r.rightContY = null;
				return G
			}
		})
	})(N);
	(function(a) {
		var D = a.seriesTypes.area.prototype,
			B = a.seriesType;
		B("areaspline", "spline", a.defaultPlotOptions.area, {
			getStackPoints: D.getStackPoints,
			getGraphPath: D.getGraphPath,
			drawGraph: D.drawGraph,
			drawLegendSymbol: a.LegendSymbolMixin.drawRectangle
		})
	})(N);
	(function(a) {
		var D = a.animObject,
			B = a.color,
			G = a.each,
			p = a.extend,
			g = a.isNumber,
			l = a.merge,
			r = a.pick,
			n = a.Series,
			w = a.seriesType,
			v = a.svg;
		w("column", "line", {
			borderRadius: 0,
			crisp: !0,
			groupPadding: .2,
			marker: null,
			pointPadding: .1,
			minPointLength: 0,
			cropThreshold: 50,
			pointRange: null,
			states: {
				hover: {
					halo: !1,
					brightness: .1
				},
				select: {
					color: "#cccccc",
					borderColor: "#000000"
				}
			},
			dataLabels: {
				align: null,
				verticalAlign: null,
				y: null
			},
			softThreshold: !1,
			startFromThreshold: !0,
			stickyTracking: !1,
			tooltip: {
				distance: 6
			},
			threshold: 0,
			borderColor: "#ffffff"
		}, {
			cropShoulder: 0,
			directTouch: !0,
			trackerGroups: ["group", "dataLabelsGroup"],
			negStacks: !0,
			init: function() {
				n.prototype.init.apply(this, arguments);
				var a = this,
					h = a.chart;
				h.hasRendered && G(h.series, function(e) {
					e.type === a.type && (e.isDirty = !0)
				})
			},
			getColumnMetrics: function() {
				var a = this,
					h = a.options,
					g = a.xAxis,
					c = a.yAxis,
					f = g.reversed,
					b, d = {},
					l = 0;
				!1 === h.grouping ? l = 1 : G(a.chart.series, function(f) {
					var e = f.options,
						g = f.yAxis,
						h;
					f.type !== a.type || !f.visible && a.chart.options.chart.ignoreHiddenSeries || c.len !== g.len || c.pos !== g.pos || (e.stacking ? (b = f.stackKey, void 0 === d[b] && (d[b] = l++), h = d[b]) : !1 !== e.grouping && (h = l++), f.columnIndex = h)
				});
				var n = Math.min(Math.abs(g.transA) * (g.ordinalSlope || h.pointRange || g.closestPointRange || g.tickInterval || 1), g.len),
					p = n * h.groupPadding,
					t = (n - 2 * p) / (l || 1),
					h = Math.min(h.maxPointWidth || g.len, r(h.pointWidth, t * (1 - 2 * h.pointPadding)));
				a.columnMetrics = {
					width: h,
					offset: (t - h) / 2 + (p + ((a.columnIndex || 0) + (f ? 1 : 0)) * t - n / 2) * (f ? -1 : 1)
				};
				return a.columnMetrics
			},
			crispCol: function(a, g, l, c) {
				var f = this.chart,
					b = this.borderWidth,
					d = -(b % 2 ? .5 : 0),
					b = b % 2 ? .5 : 1;
				f.inverted && f.renderer.isVML && (b += 1);
				this.options.crisp && (l = Math.round(a + l) + d, a = Math.round(a) + d, l -= a);
				c = Math.round(g + c) + b;
				d = .5 >= Math.abs(g) && .5 < c;
				g = Math.round(g) + b;
				c -= g;
				d && c && (--g, c += 1);
				return {
					x: a,
					y: g,
					width: l,
					height: c
				}
			},
			translate: function() {
				var a = this,
					g = a.chart,
					l = a.options,
					c = a.dense = 2 > a.closestPointRange * a.xAxis.transA,
					c = a.borderWidth = r(l.borderWidth, c ? 0 : 1),
					f = a.yAxis,
					b = l.threshold,
					d = a.translatedThreshold = f.getThreshold(b),
					p = r(l.minPointLength, 5),
					v = a.getColumnMetrics(),
					w = v.width,
					t = a.barW = Math.max(w, 1 + 2 * c),
					K = a.pointXOffset = v.offset;
				g.inverted && (d -= .5);
				l.pointPadding && (t = Math.ceil(t));
				n.prototype.translate.apply(a);
				G(a.points, function(c) {
					var e = r(c.yBottom, d),
						h = 999 + Math.abs(e),
						h = Math.min(Math.max(-h, c.plotY), f.len + h),
						l = c.plotX + K,
						m = t,
						n = Math.min(h, e),
						y, k = Math.max(h, e) - n;
					p && Math.abs(k) < p && (k = p, y = !f.reversed && !c.negative || f.reversed && c.negative, c.y === b && a.dataMax <= b && f.min < b && (y = !y), n = Math.abs(n - d) > p ? e - p : d - (y ? p : 0));
					c.barX = l;
					c.pointWidth = w;
					c.tooltipPos = g.inverted ? [f.len + f.pos - g.plotLeft - h, a.xAxis.len - l - m / 2, k] : [l + m / 2, h + f.pos - g.plotTop, k];
					c.shapeType = "rect";
					c.shapeArgs = a.crispCol.apply(a, c.isNull ? [l, d, m, 0] : [l, n, m, k])
				})
			},
			getSymbol: a.noop,
			drawLegendSymbol: a.LegendSymbolMixin.drawRectangle,
			drawGraph: function() {
				this.group[this.dense ? "addClass" : "removeClass"]("highcharts-dense-data")
			},
			pointAttribs: function(a, g) {
				var e = this.options,
					c, f = this.pointAttrToOptions || {};
				c = f.stroke || "borderColor";
				var b = f["stroke-width"] || "borderWidth",
					d = a && a.color || this.color,
					h = a && a[c] || e[c] || this.color || d,
					n = a && a[b] || e[b] || this[b] || 0,
					f = e.dashStyle;
				a && this.zones.length && (d = a.getZone(), d = a.options.color || d && d.color || this.color);
				g && (a = l(e.states[g], a.options.states && a.options.states[g] || {}), g = a.brightness, d = a.color || void 0 !== g && B(d).brighten(a.brightness).get() || d, h = a[c] || h, n = a[b] || n, f = a.dashStyle || f);
				c = {
					fill: d,
					stroke: h,
					"stroke-width": n
				};
				f && (c.dashstyle = f);
				return c
			},
			drawPoints: function() {
				var a = this,
					h = this.chart,
					m = a.options,
					c = h.renderer,
					f = m.animationLimit || 250,
					b;
				G(a.points, function(d) {
					var e = d.graphic;
					if (g(d.plotY) && null !== d.y) {
						b = d.shapeArgs;
						if (e) e[h.pointCount < f ? "animate" : "attr"](l(b));
						else d.graphic = e = c[d.shapeType](b).add(d.group || a.group);
						m.borderRadius && e.attr({
							r: m.borderRadius
						});
						e.attr(a.pointAttribs(d, d.selected && "select")).shadow(m.shadow, null, m.stacking && !m.borderRadius);
						e.addClass(d.getClassName(), !0)
					} else e && (d.graphic = e.destroy())
				})
			},
			animate: function(a) {
				var e = this,
					g = this.yAxis,
					c = e.options,
					f = this.chart.inverted,
					b = {},
					d = f ? "translateX" : "translateY",
					l;
				v && (a ? (b.scaleY = .001, a = Math.min(g.pos + g.len, Math.max(g.pos, g.toPixels(c.threshold))), f ? b.translateX = a - g.len : b.translateY = a, e.group.attr(b)) : (l = e.group.attr(d), e.group.animate({
					scaleY: 1
				}, p(D(e.options.animation), {
					step: function(a, c) {
						b[d] = l + c.pos * (g.pos - l);
						e.group.attr(b)
					}
				})), e.animate = null))
			},
			remove: function() {
				var a = this,
					g = a.chart;
				g.hasRendered && G(g.series, function(e) {
					e.type === a.type && (e.isDirty = !0)
				});
				n.prototype.remove.apply(a, arguments)
			}
		})
	})(N);
	(function(a) {
		a = a.seriesType;
		a("bar", "column", null, {
			inverted: !0
		})
	})(N);
	(function(a) {
		var D = a.Series;
		a = a.seriesType;
		a("scatter", "line", {
			lineWidth: 0,
			findNearestPointBy: "xy",
			marker: {
				enabled: !0
			},
			tooltip: {
				headerFormat: '\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cspan style\x3d"font-size: 0.85em"\x3e {series.name}\x3c/span\x3e\x3cbr/\x3e',
				pointFormat: "x: \x3cb\x3e{point.x}\x3c/b\x3e\x3cbr/\x3ey: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e"
			}
		}, {
			sorted: !1,
			requireSorting: !1,
			noSharedTooltip: !0,
			trackerGroups: ["group", "markerGroup", "dataLabelsGroup"],
			takeOrdinalPosition: !1,
			drawGraph: function() {
				this.options.lineWidth && D.prototype.drawGraph.call(this)
			}
		})
	})(N);
	(function(a) {
		var D = a.deg2rad,
			B = a.isNumber,
			G = a.pick,
			p = a.relativeLength;
		a.CenteredSeriesMixin = {
			getCenter: function() {
				var a = this.options,
					l = this.chart,
					r = 2 * (a.slicedOffset || 0),
					n = l.plotWidth - 2 * r,
					l = l.plotHeight - 2 * r,
					w = a.center,
					w = [G(w[0], "50%"), G(w[1], "50%"), a.size || "100%", a.innerSize || 0],
					v = Math.min(n, l),
					e, h;
				for (e = 0; 4 > e; ++e) h = w[e], a = 2 > e || 2 === e && /%$/.test(h), w[e] = p(h, [n, l, v, w[2]][e]) + (a ? r : 0);
				w[3] > w[2] && (w[3] = w[2]);
				return w
			},
			getStartAndEndRadians: function(a, l) {
				a = B(a) ? a : 0;
				l = B(l) && l > a && 360 > l - a ? l : a + 360;
				return {
					start: D * (a + -90),
					end: D * (l + -90)
				}
			}
		}
	})(N);
	(function(a) {
		var D = a.addEvent,
			B = a.CenteredSeriesMixin,
			G = a.defined,
			p = a.each,
			g = a.extend,
			l = B.getStartAndEndRadians,
			r = a.inArray,
			n = a.noop,
			w = a.pick,
			v = a.Point,
			e = a.Series,
			h = a.seriesType,
			m = a.setAnimation;
		h("pie", "line", {
			center: [null, null],
			clip: !1,
			colorByPoint: !0,
			dataLabels: {
				distance: 30,
				enabled: !0,
				formatter: function() {
					return this.point.isNull ? void 0 : this.point.name
				},
				x: 0
			},
			ignoreHiddenPoint: !0,
			legendType: "point",
			marker: null,
			size: null,
			showInLegend: !1,
			slicedOffset: 10,
			stickyTracking: !1,
			tooltip: {
				followPointer: !0
			},
			borderColor: "#ffffff",
			borderWidth: 1,
			states: {
				hover: {
					brightness: .1,
					shadow: !1
				}
			}
		}, {
			isCartesian: !1,
			requireSorting: !1,
			directTouch: !0,
			noSharedTooltip: !0,
			trackerGroups: ["group", "dataLabelsGroup"],
			axisTypes: [],
			pointAttribs: a.seriesTypes.column.prototype.pointAttribs,
			animate: function(a) {
				var c = this,
					b = c.points,
					d = c.startAngleRad;
				a || (p(b, function(a) {
					var b = a.graphic,
						f = a.shapeArgs;
					b && (b.attr({
						r: a.startR || c.center[3] / 2,
						start: d,
						end: d
					}), b.animate({
						r: f.r,
						start: f.start,
						end: f.end
					}, c.options.animation))
				}), c.animate = null)
			},
			updateTotals: function() {
				var a, f = 0,
					b = this.points,
					d = b.length,
					e, g = this.options.ignoreHiddenPoint;
				for (a = 0; a < d; a++) e = b[a], f += g && !e.visible ? 0 : e.isNull ? 0 : e.y;
				this.total = f;
				for (a = 0; a < d; a++) e = b[a], e.percentage = 0 < f && (e.visible || !g) ? e.y / f * 100 : 0, e.total = f
			},
			generatePoints: function() {
				e.prototype.generatePoints.call(this);
				this.updateTotals()
			},
			translate: function(a) {
				this.generatePoints();
				var c = 0,
					b = this.options,
					d = b.slicedOffset,
					e = d + (b.borderWidth || 0),
					g, h, m, n = l(b.startAngle, b.endAngle),
					p = this.startAngleRad = n.start,
					n = (this.endAngleRad = n.end) - p,
					r = this.points,
					v, q = b.dataLabels.distance,
					b = b.ignoreHiddenPoint,
					A, E = r.length,
					F;
				a || (this.center = a = this.getCenter());
				this.getX = function(b, c, d) {
					m = Math.asin(Math.min((b - a[1]) / (a[2] / 2 + d.labelDistance), 1));
					return a[0] + (c ? -1 : 1) * Math.cos(m) * (a[2] / 2 + d.labelDistance)
				};
				for (A = 0; A < E; A++) {
					F = r[A];
					F.labelDistance = w(F.options.dataLabels && F.options.dataLabels.distance, q);
					this.maxLabelDistance = Math.max(this.maxLabelDistance || 0, F.labelDistance);
					g = p + c * n;
					if (!b || F.visible) c += F.percentage / 100;
					h = p + c * n;
					F.shapeType = "arc";
					F.shapeArgs = {
						x: a[0],
						y: a[1],
						r: a[2] / 2,
						innerR: a[3] / 2,
						start: Math.round(1E3 * g) / 1E3,
						end: Math.round(1E3 * h) / 1E3
					};
					m = (h + g) / 2;
					m > 1.5 * Math.PI ? m -= 2 * Math.PI : m < -Math.PI / 2 && (m += 2 * Math.PI);
					F.slicedTranslation = {
						translateX: Math.round(Math.cos(m) * d),
						translateY: Math.round(Math.sin(m) * d)
					};
					h = Math.cos(m) * a[2] / 2;
					v = Math.sin(m) * a[2] / 2;
					F.tooltipPos = [a[0] + .7 * h, a[1] + .7 * v];
					F.half = m < -Math.PI / 2 || m > Math.PI / 2 ? 1 : 0;
					F.angle = m;
					g = Math.min(e, F.labelDistance / 5);
					F.labelPos = [a[0] + h + Math.cos(m) * F.labelDistance, a[1] + v + Math.sin(m) * F.labelDistance, a[0] + h + Math.cos(m) * g, a[1] + v + Math.sin(m) * g, a[0] + h, a[1] + v, 0 > F.labelDistance ? "center" : F.half ? "right" : "left", m]
				}
			},
			drawGraph: null,
			drawPoints: function() {
				var a = this,
					f = a.chart.renderer,
					b, d, e, h, l = a.options.shadow;
				l && !a.shadowGroup && (a.shadowGroup = f.g("shadow").add(a.group));
				p(a.points, function(c) {
					d = c.graphic;
					if (c.isNull) d && (c.graphic = d.destroy());
					else {
						h = c.shapeArgs;
						b = c.getTranslate();
						var m = c.shadowGroup;
						l && !m && (m = c.shadowGroup = f.g("shadow").add(a.shadowGroup));
						m && m.attr(b);
						e = a.pointAttribs(c, c.selected && "select");
						d ? d.setRadialReference(a.center).attr(e).animate(g(h, b)) : (c.graphic = d = f[c.shapeType](h).setRadialReference(a.center).attr(b).add(a.group), c.visible || d.attr({
							visibility: "hidden"
						}), d.attr(e).attr({
							"stroke-linejoin": "round"
						}).shadow(l, m));
						d.addClass(c.getClassName())
					}
				})
			},
			searchPoint: n,
			sortByAngle: function(a, f) {
				a.sort(function(a, c) {
					return void 0 !== a.angle && (c.angle - a.angle) * f
				})
			},
			drawLegendSymbol: a.LegendSymbolMixin.drawRectangle,
			getCenter: B.getCenter,
			getSymbol: n
		}, {
			init: function() {
				v.prototype.init.apply(this, arguments);
				var a = this,
					f;
				a.name = w(a.name, "Slice");
				f = function(b) {
					a.slice("select" === b.type)
				};
				D(a, "select", f);
				D(a, "unselect", f);
				return a
			},
			isValid: function() {
				return a.isNumber(this.y, !0) && 0 <= this.y
			},
			setVisible: function(a, f) {
				var b = this,
					c = b.series,
					e = c.chart,
					g = c.options.ignoreHiddenPoint;
				f = w(f, g);
				a !== b.visible && (b.visible = b.options.visible = a = void 0 === a ? !b.visible : a, c.options.data[r(b, c.data)] = b.options, p(["graphic", "dataLabel", "connector", "shadowGroup"], function(c) {
					if (b[c]) b[c][a ? "show" : "hide"](!0)
				}), b.legendItem && e.legend.colorizeItem(b, a), a || "hover" !== b.state || b.setState(""), g && (c.isDirty = !0), f && e.redraw())
			},
			slice: function(a, f, b) {
				var c = this.series;
				m(b, c.chart);
				w(f, !0);
				this.sliced = this.options.sliced = G(a) ? a : !this.sliced;
				c.options.data[r(this, c.data)] = this.options;
				this.graphic.animate(this.getTranslate());
				this.shadowGroup && this.shadowGroup.animate(this.getTranslate())
			},
			getTranslate: function() {
				return this.sliced ? this.slicedTranslation : {
					translateX: 0,
					translateY: 0
				}
			},
			haloPath: function(a) {
				var c = this.shapeArgs;
				return this.sliced || !this.visible ? [] : this.series.chart.renderer.symbols.arc(c.x, c.y, c.r + a, c.r + a, {
					innerR: this.shapeArgs.r,
					start: c.start,
					end: c.end
				})
			}
		})
	})(N);
	(function(a) {
		var D = a.addEvent,
			B = a.arrayMax,
			G = a.defined,
			p = a.each,
			g = a.extend,
			l = a.format,
			r = a.map,
			n = a.merge,
			w = a.noop,
			v = a.pick,
			e = a.relativeLength,
			h = a.Series,
			m = a.seriesTypes,
			c = a.stableSort;
		a.distribute = function(a, b) {
			function d(a, b) {
				return a.target - b.target
			}
			var f, e = !0,
				g = a,
				h = [],
				l;
			l = 0;
			for (f = a.length; f--;) l += a[f].size;
			if (l > b) {
				c(a, function(a, b) {
					return (b.rank || 0) - (a.rank || 0)
				});
				for (l = f = 0; l <= b;) l += a[f].size, f++;
				h = a.splice(f - 1, a.length)
			}
			c(a, d);
			for (a = r(a, function(a) {
				return {
					size: a.size,
					targets: [a.target],
					align: v(a.align, .5)
				}
			}); e;) {
				for (f = a.length; f--;) e = a[f], l = (Math.min.apply(0, e.targets) + Math.max.apply(0, e.targets)) / 2, e.pos = Math.min(Math.max(0, l - e.size * e.align), b - e.size);
				f = a.length;
				for (e = !1; f--;) 0 < f && a[f - 1].pos + a[f - 1].size > a[f].pos && (a[f - 1].size += a[f].size, a[f - 1].targets = a[f - 1].targets.concat(a[f].targets), a[f - 1].align = .5, a[f - 1].pos + a[f - 1].size > b && (a[f - 1].pos = b - a[f - 1].size), a.splice(f, 1), e = !0)
			}
			f = 0;
			p(a, function(a) {
				var b = 0;
				p(a.targets, function() {
					g[f].pos = a.pos + b;
					b += g[f].size;
					f++
				})
			});
			g.push.apply(g, h);
			c(g, d)
		};
		h.prototype.drawDataLabels = function() {
			function c(a, b) {
				var c = b.filter;
				return c ? (b = c.operator, a = a[c.property], c = c.value, "\x3e" === b && a > c || "\x3c" === b && a < c || "\x3e\x3d" === b && a >= c || "\x3c\x3d" === b && a <= c || "\x3d\x3d" === b && a == c || "\x3d\x3d\x3d" === b && a === c ? !0 : !1) : !0
			}
			var b = this,
				d = b.options,
				e = d.dataLabels,
				g = b.points,
				h, m, r = b.hasRendered || 0,
				x, w, B = v(e.defer, !! d.animation),
				q = b.chart.renderer;
			if (e.enabled || b._hasPointLabels) b.dlProcessOptions && b.dlProcessOptions(e), w = b.plotGroup("dataLabelsGroup", "data-labels", B && !r ? "hidden" : "visible", e.zIndex || 6), B && (w.attr({
				opacity: +r
			}), r || D(b, "afterAnimate", function() {
				b.visible && w.show(!0);
				w[d.animation ? "animate" : "attr"]({
					opacity: 1
				}, {
					duration: 200
				})
			})), m = e, p(g, function(f) {
				var g, t = f.dataLabel,
					k, p, r = f.connector,
					y = !t,
					C;
				h = f.dlOptions || f.options && f.options.dataLabels;
				(g = v(h && h.enabled, m.enabled) && !f.isNull) && (g = !0 === c(f, h || e));
				g && (e = n(m, h), k = f.getLabelConfig(), C = e[f.formatPrefix + "Format"] || e.format, x = G(C) ? l(C, k) : (e[f.formatPrefix + "Formatter"] || e.formatter).call(k, e), C = e.style, k = e.rotation, C.color = v(e.color, C.color, b.color, "#000000"), "contrast" === C.color && (f.contrastColor = q.getContrast(f.color || b.color), C.color = e.inside || 0 > v(f.labelDistance, e.distance) || d.stacking ? f.contrastColor : "#000000"), d.cursor && (C.cursor = d.cursor), p = {
					fill: e.backgroundColor,
					stroke: e.borderColor,
					"stroke-width": e.borderWidth,
					r: e.borderRadius || 0,
					rotation: k,
					padding: e.padding,
					zIndex: 1
				}, a.objectEach(p, function(a, b) {
					void 0 === a && delete p[b]
				}));
				!t || g && G(x) ? g && G(x) && (t ? p.text = x : (t = f.dataLabel = q[k ? "text" : "label"](x, 0, -9999, e.shape, null, null, e.useHTML, null, "data-label"), t.addClass("highcharts-data-label-color-" + f.colorIndex + " " + (e.className || "") + (e.useHTML ? "highcharts-tracker" : ""))), t.attr(p), t.css(C).shadow(e.shadow), t.added || t.add(w), b.alignDataLabel(f, t, e, null, y)) : (f.dataLabel = t = t.destroy(), r && (f.connector = r.destroy()))
			})
		};
		h.prototype.alignDataLabel = function(a, b, c, e, h) {
			var d = this.chart,
				f = d.inverted,
				l = v(a.dlBox && a.dlBox.centerX, a.plotX, -9999),
				m = v(a.plotY, -9999),
				n = b.getBBox(),
				p, q = c.rotation,
				r = c.align,
				w = this.visible && (a.series.forceDL || d.isInsidePlot(l, Math.round(m), f) || e && d.isInsidePlot(l, f ? e.x + 1 : e.y + e.height - 1, f)),
				y = "justify" === v(c.overflow, "justify");
			if (w && (p = c.style.fontSize, p = d.renderer.fontMetrics(p, b).b, e = g({
				x: f ? this.yAxis.len - m : l,
				y: Math.round(f ? this.xAxis.len - l : m),
				width: 0,
				height: 0
			}, e), g(c, {
				width: n.width,
				height: n.height
			}), q ? (y = !1, l = d.renderer.rotCorr(p, q), l = {
				x: e.x + c.x + e.width / 2 + l.x,
				y: e.y + c.y + {
					top: 0,
					middle: .5,
					bottom: 1
				}[c.verticalAlign] * e.height
			}, b[h ? "attr" : "animate"](l).attr({
				align: r
			}), m = (q + 720) % 360, m = 180 < m && 360 > m, "left" === r ? l.y -= m ? n.height : 0 : "center" === r ? (l.x -= n.width / 2, l.y -= n.height / 2) : "right" === r && (l.x -= n.width, l.y -= m ? 0 : n.height)) : (b.align(c, null, e), l = b.alignAttr), y ? a.isLabelJustified = this.justifyDataLabel(b, c, l, n, e, h) : v(c.crop, !0) && (w = d.isInsidePlot(l.x, l.y) && d.isInsidePlot(l.x + n.width, l.y + n.height)), c.shape && !q)) b[h ? "attr" : "animate"]({
				anchorX: f ? d.plotWidth - a.plotY : a.plotX,
				anchorY: f ? d.plotHeight - a.plotX : a.plotY
			});
			w || (b.attr({
				y: -9999
			}), b.placed = !1)
		};
		h.prototype.justifyDataLabel = function(a, b, c, e, g, h) {
			var d = this.chart,
				f = b.align,
				l = b.verticalAlign,
				m, n, q = a.box ? 0 : a.padding || 0;
			m = c.x + q;
			0 > m && ("right" === f ? b.align = "left" : b.x = -m, n = !0);
			m = c.x + e.width - q;
			m > d.plotWidth && ("left" === f ? b.align = "right" : b.x = d.plotWidth - m, n = !0);
			m = c.y + q;
			0 > m && ("bottom" === l ? b.verticalAlign = "top" : b.y = -m, n = !0);
			m = c.y + e.height - q;
			m > d.plotHeight && ("top" === l ? b.verticalAlign = "bottom" : b.y = d.plotHeight - m, n = !0);
			n && (a.placed = !h, a.align(b, null, g));
			return n
		};
		m.pie && (m.pie.prototype.drawDataLabels = function() {
			var c = this,
				b = c.data,
				d, e = c.chart,
				g = c.options.dataLabels,
				l = v(g.connectorPadding, 10),
				m = v(g.connectorWidth, 1),
				n = e.plotWidth,
				r = e.plotHeight,
				w, D = c.center,
				q = D[2] / 2,
				A = D[1],
				E, F, k, u, N = [
					[],
					[]
				],
				M, P, I, Q, z = [0, 0, 0, 0];
			c.visible && (g.enabled || c._hasPointLabels) && (p(b, function(a) {
				a.dataLabel && a.visible && a.dataLabel.shortened && (a.dataLabel.attr({
					width: "auto"
				}).css({
					width: "auto",
					textOverflow: "clip"
				}), a.dataLabel.shortened = !1)
			}), h.prototype.drawDataLabels.apply(c), p(b, function(a) {
				a.dataLabel && a.visible && (N[a.half].push(a), a.dataLabel._pos = null)
			}), p(N, function(b, f) {
				var h, m, t = b.length,
					x = [],
					w;
				if (t) for (c.sortByAngle(b, f - .5), 0 < c.maxLabelDistance && (h = Math.max(0, A - q - c.maxLabelDistance), m = Math.min(A + q + c.maxLabelDistance, e.plotHeight), p(b, function(a) {
					0 < a.labelDistance && a.dataLabel && (a.top = Math.max(0, A - q - a.labelDistance), a.bottom = Math.min(A + q + a.labelDistance, e.plotHeight), w = a.dataLabel.getBBox().height || 21, a.positionsIndex = x.push({
						target: a.labelPos[1] - a.top + w / 2,
						size: w,
						rank: a.y
					}) - 1)
				}), a.distribute(x, m + w - h)), Q = 0; Q < t; Q++) d = b[Q], m = d.positionsIndex, k = d.labelPos, E = d.dataLabel, I = !1 === d.visible ? "hidden" : "inherit", P = h = k[1], x && G(x[m]) && (void 0 === x[m].pos ? I = "hidden" : (u = x[m].size, P = d.top + x[m].pos)), delete d.positionIndex, M = g.justify ? D[0] + (f ? -1 : 1) * (q + d.labelDistance) : c.getX(P < d.top + 2 || P > d.bottom - 2 ? h : P, f, d), E._attr = {
					visibility: I,
					align: k[6]
				}, E._pos = {
					x: M + g.x + ({
						left: l,
						right: -l
					}[k[6]] || 0),
					y: P + g.y - 10
				}, k.x = M, k.y = P, v(g.crop, !0) && (F = E.getBBox().width, h = null, M - F < l ? (h = Math.round(F - M + l), z[3] = Math.max(h, z[3])) : M + F > n - l && (h = Math.round(M + F - n + l), z[1] = Math.max(h, z[1])), 0 > P - u / 2 ? z[0] = Math.max(Math.round(-P + u / 2), z[0]) : P + u / 2 > r && (z[2] = Math.max(Math.round(P + u / 2 - r), z[2])), E.sideOverflow = h)
			}), 0 === B(z) || this.verifyDataLabelOverflow(z)) && (this.placeDataLabels(), m && p(this.points, function(a) {
				var b;
				w = a.connector;
				if ((E = a.dataLabel) && E._pos && a.visible && 0 < a.labelDistance) {
					I = E._attr.visibility;
					if (b = !w) a.connector = w = e.renderer.path().addClass("highcharts-data-label-connector  highcharts-color-" + a.colorIndex).add(c.dataLabelsGroup), w.attr({
						"stroke-width": m,
						stroke: g.connectorColor || a.color || "#666666"
					});
					w[b ? "attr" : "animate"]({
						d: c.connectorPath(a.labelPos)
					});
					w.attr("visibility", I)
				} else w && (a.connector = w.destroy())
			}))
		}, m.pie.prototype.connectorPath = function(a) {
			var b = a.x,
				c = a.y;
			return v(this.options.dataLabels.softConnector, !0) ? ["M", b + ("left" === a[6] ? 5 : -5), c, "C", b, c, 2 * a[2] - a[4], 2 * a[3] - a[5], a[2], a[3], "L", a[4], a[5]] : ["M", b + ("left" === a[6] ? 5 : -5), c, "L", a[2], a[3], "L", a[4], a[5]]
		}, m.pie.prototype.placeDataLabels = function() {
			p(this.points, function(a) {
				var b = a.dataLabel;
				b && a.visible && ((a = b._pos) ? (b.sideOverflow && (b._attr.width = b.getBBox().width - b.sideOverflow, b.css({
					width: b._attr.width + "px",
					textOverflow: "ellipsis"
				}), b.shortened = !0), b.attr(b._attr), b[b.moved ? "animate" : "attr"](a), b.moved = !0) : b && b.attr({
					y: -9999
				}))
			}, this)
		}, m.pie.prototype.alignDataLabel = w, m.pie.prototype.verifyDataLabelOverflow = function(a) {
			var b = this.center,
				c = this.options,
				f = c.center,
				g = c.minSize || 80,
				h, l = null !== c.size;
			l || (null !== f[0] ? h = Math.max(b[2] - Math.max(a[1], a[3]), g) : (h = Math.max(b[2] - a[1] - a[3], g), b[0] += (a[3] - a[1]) / 2), null !== f[1] ? h = Math.max(Math.min(h, b[2] - Math.max(a[0], a[2])), g) : (h = Math.max(Math.min(h, b[2] - a[0] - a[2]), g), b[1] += (a[0] - a[2]) / 2), h < b[2] ? (b[2] = h, b[3] = Math.min(e(c.innerSize || 0, h), h), this.translate(b), this.drawDataLabels && this.drawDataLabels()) : l = !0);
			return l
		});
		m.column && (m.column.prototype.alignDataLabel = function(a, b, c, e, g) {
			var d = this.chart.inverted,
				f = a.series,
				l = a.dlBox || a.shapeArgs,
				m = v(a.below, a.plotY > v(this.translatedThreshold, f.yAxis.len)),
				p = v(c.inside, !! this.options.stacking);
			l && (e = n(l), 0 > e.y && (e.height += e.y, e.y = 0), l = e.y + e.height - f.yAxis.len, 0 < l && (e.height -= l), d && (e = {
				x: f.yAxis.len - e.y - e.height,
				y: f.xAxis.len - e.x - e.width,
				width: e.height,
				height: e.width
			}), p || (d ? (e.x += m ? 0 : e.width, e.width = 0) : (e.y += m ? e.height : 0, e.height = 0)));
			c.align = v(c.align, !d || p ? "center" : m ? "right" : "left");
			c.verticalAlign = v(c.verticalAlign, d || p ? "middle" : m ? "top" : "bottom");
			h.prototype.alignDataLabel.call(this, a, b, c, e, g);
			a.isLabelJustified && a.contrastColor && a.dataLabel.css({
				color: a.contrastColor
			})
		})
	})(N);
	(function(a) {
		var D = a.Chart,
			B = a.each,
			G = a.objectEach,
			p = a.pick;
		a = a.addEvent;
		a(D.prototype, "render", function() {
			var a = [];
			B(this.labelCollectors || [], function(g) {
				a = a.concat(g())
			});
			B(this.yAxis || [], function(g) {
				g.options.stackLabels && !g.options.stackLabels.allowOverlap && G(g.stacks, function(g) {
					G(g, function(g) {
						a.push(g.label)
					})
				})
			});
			B(this.series || [], function(g) {
				var l = g.options.dataLabels,
					n = g.dataLabelCollections || ["dataLabel"];
				(l.enabled || g._hasPointLabels) && !l.allowOverlap && g.visible && B(n, function(l) {
					B(g.points, function(g) {
						g[l] && (g[l].labelrank = p(g.labelrank, g.shapeArgs && g.shapeArgs.height), a.push(g[l]))
					})
				})
			});
			this.hideOverlappingLabels(a)
		});
		D.prototype.hideOverlappingLabels = function(a) {
			var g = a.length,
				p, n, w, v, e, h, m, c, f, b = function(a, b, c, f, e, g, h, l) {
					return !(e > a + c || e + h < a || g > b + f || g + l < b)
				};
			for (n = 0; n < g; n++) if (p = a[n]) p.oldOpacity = p.opacity, p.newOpacity = 1, p.width || (w = p.getBBox(), p.width = w.width, p.height = w.height);
			a.sort(function(a, b) {
				return (b.labelrank || 0) - (a.labelrank || 0)
			});
			for (n = 0; n < g; n++) for (w = a[n], p = n + 1; p < g; ++p) if (v = a[p], w && v && w !== v && w.placed && v.placed && 0 !== w.newOpacity && 0 !== v.newOpacity && (e = w.alignAttr, h = v.alignAttr, m = w.parentGroup, c = v.parentGroup, f = 2 * (w.box ? 0 : w.padding || 0), e = b(e.x + m.translateX, e.y + m.translateY, w.width - f, w.height - f, h.x + c.translateX, h.y + c.translateY, v.width - f, v.height - f)))(w.labelrank < v.labelrank ? w : v).newOpacity = 0;
			B(a, function(a) {
				var b, c;
				a && (c = a.newOpacity, a.oldOpacity !== c && a.placed && (c ? a.show(!0) : b = function() {
					a.hide()
				}, a.alignAttr.opacity = c, a[a.isOld ? "animate" : "attr"](a.alignAttr, null, b)), a.isOld = !0)
			})
		}
	})(N);
	(function(a) {
		var D = a.addEvent,
			B = a.Chart,
			G = a.createElement,
			p = a.css,
			g = a.defaultOptions,
			l = a.defaultPlotOptions,
			r = a.each,
			n = a.extend,
			w = a.fireEvent,
			v = a.hasTouch,
			e = a.inArray,
			h = a.isObject,
			m = a.Legend,
			c = a.merge,
			f = a.pick,
			b = a.Point,
			d = a.Series,
			y = a.seriesTypes,
			H = a.svg,
			J;
		J = a.TrackerMixin = {
			drawTrackerPoint: function() {
				var a = this,
					b = a.chart.pointer,
					c = function(a) {
						var c = b.getPointFromEvent(a);
						void 0 !== c && (b.isDirectTouch = !0, c.onMouseOver(a))
					};
				r(a.points, function(a) {
					a.graphic && (a.graphic.element.point = a);
					a.dataLabel && (a.dataLabel.div ? a.dataLabel.div.point = a : a.dataLabel.element.point = a)
				});
				a._hasTracking || (r(a.trackerGroups, function(d) {
					if (a[d]) {
						a[d].addClass("highcharts-tracker").on("mouseover", c).on("mouseout", function(a) {
							b.onTrackerMouseOut(a)
						});
						if (v) a[d].on("touchstart", c);
						a.options.cursor && a[d].css(p).css({
							cursor: a.options.cursor
						})
					}
				}), a._hasTracking = !0)
			},
			drawTrackerGraph: function() {
				var a = this,
					b = a.options,
					c = b.trackByArea,
					d = [].concat(c ? a.areaPath : a.graphPath),
					f = d.length,
					e = a.chart,
					g = e.pointer,
					h = e.renderer,
					l = e.options.tooltip.snap,
					k = a.tracker,
					m, n = function() {
						if (e.hoverSeries !== a) a.onMouseOver()
					},
					p = "rgba(192,192,192," + (H ? .0001 : .002) + ")";
				if (f && !c) for (m = f + 1; m--;)"M" === d[m] && d.splice(m + 1, 0, d[m + 1] - l, d[m + 2], "L"), (m && "M" === d[m] || m === f) && d.splice(m, 0, "L", d[m - 2] + l, d[m - 1]);
				k ? k.attr({
					d: d
				}) : a.graph && (a.tracker = h.path(d).attr({
					"stroke-linejoin": "round",
					visibility: a.visible ? "visible" : "hidden",
					stroke: p,
					fill: c ? p : "none",
					"stroke-width": a.graph.strokeWidth() + (c ? 0 : 2 * l),
					zIndex: 2
				}).add(a.group), r([a.tracker, a.markerGroup], function(a) {
					a.addClass("highcharts-tracker").on("mouseover", n).on("mouseout", function(a) {
						g.onTrackerMouseOut(a)
					});
					b.cursor && a.css({
						cursor: b.cursor
					});
					if (v) a.on("touchstart", n)
				}))
			}
		};
		y.column && (y.column.prototype.drawTracker = J.drawTrackerPoint);
		y.pie && (y.pie.prototype.drawTracker = J.drawTrackerPoint);
		y.scatter && (y.scatter.prototype.drawTracker = J.drawTrackerPoint);
		n(m.prototype, {
			setItemEvents: function(a, b, d) {
				var f = this,
					e = f.chart.renderer.boxWrapper,
					g = "highcharts-legend-" + (a.series ? "point" : "series") + "-active";
				(d ? b : a.legendGroup).on("mouseover", function() {
					a.setState("hover");
					e.addClass(g);
					b.css(f.options.itemHoverStyle)
				}).on("mouseout", function() {
					b.css(c(a.visible ? f.itemStyle : f.itemHiddenStyle));
					e.removeClass(g);
					a.setState()
				}).on("click", function(b) {
					var c = function() {
							a.setVisible && a.setVisible()
						};
					b = {
						browserEvent: b
					};
					a.firePointEvent ? a.firePointEvent("legendItemClick", b, c) : w(a, "legendItemClick", b, c)
				})
			},
			createCheckboxForItem: function(a) {
				a.checkbox = G("input", {
					type: "checkbox",
					checked: a.selected,
					defaultChecked: a.selected
				}, this.options.itemCheckboxStyle, this.chart.container);
				D(a.checkbox, "click", function(b) {
					w(a.series || a, "checkboxClick", {
						checked: b.target.checked,
						item: a
					}, function() {
						a.select()
					})
				})
			}
		});
		g.legend.itemStyle.cursor = "pointer";
		n(B.prototype, {
			showResetZoom: function() {
				var a = this,
					b = g.lang,
					c = a.options.chart.resetZoomButton,
					d = c.theme,
					f = d.states,
					e = "chart" === c.relativeTo ? null : "plotBox";
				this.resetZoomButton = a.renderer.button(b.resetZoom, null, null, function() {
					a.zoomOut()
				}, d, f && f.hover).attr({
					align: c.position.align,
					title: b.resetZoomTitle
				}).addClass("highcharts-reset-zoom").add().align(c.position, !1, e)
			},
			zoomOut: function() {
				var a = this;
				w(a, "selection", {
					resetSelection: !0
				}, function() {
					a.zoom()
				})
			},
			zoom: function(a) {
				var b, c = this.pointer,
					d = !1,
					e;
				!a || a.resetSelection ? (r(this.axes, function(a) {
					b = a.zoom()
				}), c.initiated = !1) : r(a.xAxis.concat(a.yAxis), function(a) {
					var f = a.axis;
					c[f.isXAxis ? "zoomX" : "zoomY"] && (b = f.zoom(a.min, a.max), f.displayBtn && (d = !0))
				});
				e = this.resetZoomButton;
				d && !e ? this.showResetZoom() : !d && h(e) && (this.resetZoomButton = e.destroy());
				b && this.redraw(f(this.options.chart.animation, a && a.animation, 100 > this.pointCount))
			},
			pan: function(a, b) {
				var c = this,
					d = c.hoverPoints,
					f;
				d && r(d, function(a) {
					a.setState()
				});
				r("xy" === b ? [1, 0] : [1], function(b) {
					b = c[b ? "xAxis" : "yAxis"][0];
					var d = b.horiz,
						e = a[d ? "chartX" : "chartY"],
						d = d ? "mouseDownX" : "mouseDownY",
						g = c[d],
						k = (b.pointRange || 0) / 2,
						h = b.getExtremes(),
						l = b.toValue(g - e, !0) + k,
						k = b.toValue(g + b.len - e, !0) - k,
						m = k < l,
						g = m ? k : l,
						l = m ? l : k,
						k = Math.min(h.dataMin, b.toValue(b.toPixels(h.min) - b.minPixelPadding)),
						m = Math.max(h.dataMax, b.toValue(b.toPixels(h.max) + b.minPixelPadding)),
						n;
					n = k - g;
					0 < n && (l += n, g = k);
					n = l - m;
					0 < n && (l = m, g -= n);
					b.series.length && g !== h.min && l !== h.max && (b.setExtremes(g, l, !1, !1, {
						trigger: "pan"
					}), f = !0);
					c[d] = e
				});
				f && c.redraw(!1);
				p(c.container, {
					cursor: "move"
				})
			}
		});
		n(b.prototype, {
			select: function(a, b) {
				var c = this,
					d = c.series,
					g = d.chart;
				a = f(a, !c.selected);
				c.firePointEvent(a ? "select" : "unselect", {
					accumulate: b
				}, function() {
					c.selected = c.options.selected = a;
					d.options.data[e(c, d.data)] = c.options;
					c.setState(a && "select");
					b || r(g.getSelectedPoints(), function(a) {
						a.selected && a !== c && (a.selected = a.options.selected = !1, d.options.data[e(a, d.data)] = a.options, a.setState(""), a.firePointEvent("unselect"))
					})
				})
			},
			onMouseOver: function(a) {
				var b = this.series.chart,
					c = b.pointer;
				a = a ? c.normalize(a) : c.getChartCoordinatesFromPoint(this, b.inverted);
				c.runPointActions(a, this)
			},
			onMouseOut: function() {
				var a = this.series.chart;
				this.firePointEvent("mouseOut");
				r(a.hoverPoints || [], function(a) {
					a.setState()
				});
				a.hoverPoints = a.hoverPoint = null
			},
			importEvents: function() {
				if (!this.hasImportedEvents) {
					var b = this,
						d = c(b.series.options.point, b.options).events;
					b.events = d;
					a.objectEach(d, function(a, c) {
						D(b, c, a)
					});
					this.hasImportedEvents = !0
				}
			},
			setState: function(a, b) {
				var c = Math.floor(this.plotX),
					d = this.plotY,
					e = this.series,
					g = e.options.states[a] || {},
					h = l[e.type].marker && e.options.marker,
					m = h && !1 === h.enabled,
					p = h && h.states && h.states[a] || {},
					k = !1 === p.enabled,
					t = e.stateMarkerGraphic,
					r = this.marker || {},
					v = e.chart,
					w = e.halo,
					y, B = h && e.markerAttribs;
				a = a || "";
				if (!(a === this.state && !b || this.selected && "select" !== a || !1 === g.enabled || a && (k || m && !1 === p.enabled) || a && r.states && r.states[a] && !1 === r.states[a].enabled)) {
					B && (y = e.markerAttribs(this, a));
					if (this.graphic) this.state && this.graphic.removeClass("highcharts-point-" + this.state), a && this.graphic.addClass("highcharts-point-" + a), this.graphic.animate(e.pointAttribs(this, a), f(v.options.chart.animation, g.animation)), y && this.graphic.animate(y, f(v.options.chart.animation, p.animation, h.animation)), t && t.hide();
					else {
						if (a && p) {
							h = r.symbol || e.symbol;
							t && t.currentSymbol !== h && (t = t.destroy());
							if (t) t[b ? "animate" : "attr"]({
								x: y.x,
								y: y.y
							});
							else h && (e.stateMarkerGraphic = t = v.renderer.symbol(h, y.x, y.y, y.width, y.height).add(e.markerGroup), t.currentSymbol = h);
							t && t.attr(e.pointAttribs(this, a))
						}
						t && (t[a && v.isInsidePlot(c, d, v.inverted) ? "show" : "hide"](), t.element.point = this)
					}(c = g.halo) && c.size ? (w || (e.halo = w = v.renderer.path().add((this.graphic || t).parentGroup)), w[b ? "animate" : "attr"]({
						d: this.haloPath(c.size)
					}), w.attr({
						"class": "highcharts-halo highcharts-color-" + f(this.colorIndex, e.colorIndex)
					}), w.point = this, w.attr(n({
						fill: this.color || e.color,
						"fill-opacity": c.opacity,
						zIndex: -1
					}, c.attributes))) : w && w.point && w.point.haloPath && w.animate({
						d: w.point.haloPath(0)
					});
					this.state = a
				}
			},
			haloPath: function(a) {
				return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX) - a, this.plotY - a, 2 * a, 2 * a)
			}
		});
		n(d.prototype, {
			onMouseOver: function() {
				var a = this.chart,
					b = a.hoverSeries;
				if (b && b !== this) b.onMouseOut();
				this.options.events.mouseOver && w(this, "mouseOver");
				this.setState("hover");
				a.hoverSeries = this
			},
			onMouseOut: function() {
				var a = this.options,
					b = this.chart,
					c = b.tooltip,
					d = b.hoverPoint;
				b.hoverSeries = null;
				if (d) d.onMouseOut();
				this && a.events.mouseOut && w(this, "mouseOut");
				!c || this.stickyTracking || c.shared && !this.noSharedTooltip || c.hide();
				this.setState()
			},
			setState: function(a) {
				var b = this,
					c = b.options,
					d = b.graph,
					e = c.states,
					g = c.lineWidth,
					c = 0;
				a = a || "";
				if (b.state !== a && (r([b.group, b.markerGroup, b.dataLabelsGroup], function(c) {
					c && (b.state && c.removeClass("highcharts-series-" + b.state), a && c.addClass("highcharts-series-" + a))
				}), b.state = a, !e[a] || !1 !== e[a].enabled) && (a && (g = e[a].lineWidth || g + (e[a].lineWidthPlus || 0)), d && !d.dashstyle)) for (g = {
					"stroke-width": g
				}, d.animate(g, f(b.chart.options.chart.animation, e[a] && e[a].animation)); b["zone-graph-" + c];) b["zone-graph-" + c].attr(g), c += 1
			},
			setVisible: function(a, b) {
				var c = this,
					d = c.chart,
					e = c.legendItem,
					f, g = d.options.chart.ignoreHiddenSeries,
					h = c.visible;
				f = (c.visible = a = c.options.visible = c.userOptions.visible = void 0 === a ? !h : a) ? "show" : "hide";
				r(["group", "dataLabelsGroup", "markerGroup", "tracker", "tt"], function(a) {
					if (c[a]) c[a][f]()
				});
				if (d.hoverSeries === c || (d.hoverPoint && d.hoverPoint.series) === c) c.onMouseOut();
				e && d.legend.colorizeItem(c, a);
				c.isDirty = !0;
				c.options.stacking && r(d.series, function(a) {
					a.options.stacking && a.visible && (a.isDirty = !0)
				});
				r(c.linkedSeries, function(b) {
					b.setVisible(a, !1)
				});
				g && (d.isDirtyBox = !0);
				!1 !== b && d.redraw();
				w(c, f)
			},
			show: function() {
				this.setVisible(!0)
			},
			hide: function() {
				this.setVisible(!1)
			},
			select: function(a) {
				this.selected = a = void 0 === a ? !this.selected : a;
				this.checkbox && (this.checkbox.checked = a);
				w(this, a ? "select" : "unselect")
			},
			drawTracker: J.drawTrackerGraph
		})
	})(N);
	(function(a) {
		var D = a.Chart,
			B = a.each,
			G = a.inArray,
			p = a.isArray,
			g = a.isObject,
			l = a.pick,
			r = a.splat;
		D.prototype.setResponsive = function(g) {
			var l = this.options.responsive,
				n = [],
				e = this.currentResponsive;
			l && l.rules && B(l.rules, function(e) {
				void 0 === e._id && (e._id = a.uniqueKey());
				this.matchResponsiveRule(e, n, g)
			}, this);
			var h = a.merge.apply(0, a.map(n, function(e) {
				return a.find(l.rules, function(a) {
					return a._id === e
				}).chartOptions
			})),
				n = n.toString() || void 0;
			n !== (e && e.ruleIds) && (e && this.update(e.undoOptions, g), n ? (this.currentResponsive = {
				ruleIds: n,
				mergedOptions: h,
				undoOptions: this.currentOptions(h)
			}, this.update(h, g)) : this.currentResponsive = void 0)
		};
		D.prototype.matchResponsiveRule = function(a, g) {
			var n = a.condition;
			(n.callback ||
			function() {
				return this.chartWidth <= l(n.maxWidth, Number.MAX_VALUE) && this.chartHeight <= l(n.maxHeight, Number.MAX_VALUE) && this.chartWidth >= l(n.minWidth, 0) && this.chartHeight >= l(n.minHeight, 0)
			}).call(this) && g.push(a._id)
		};
		D.prototype.currentOptions = function(l) {
			function n(e, h, l, c) {
				var f;
				a.objectEach(e, function(a, d) {
					if (!c && -1 < G(d, ["series", "xAxis", "yAxis"])) for (a = r(a), l[d] = [], f = 0; f < a.length; f++) h[d][f] && (l[d][f] = {}, n(a[f], h[d][f], l[d][f], c + 1));
					else g(a) ? (l[d] = p(a) ? [] : {}, n(a, h[d] || {}, l[d], c + 1)) : l[d] = h[d] || null
				})
			}
			var v = {};
			n(l, this.options, v, 0);
			return v
		}
	})(N);
	return N
});